Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
      3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      4  *
      5  * This code is free software; you can redistribute it and/or modify it
      6  * under the terms of the GNU General Public License version 2 only, as
      7  * published by the Free Software Foundation.  Oracle designates this
      8  * particular file as subject to the "Classpath" exception as provided
      9  * by Oracle in the LICENSE file that accompanied this code.
     10  *
     11  * This code is distributed in the hope that it will be useful, but WITHOUT
     12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  * version 2 for more details (a copy is included in the LICENSE file that
     15  * accompanied this code).
     16  *
     17  * You should have received a copy of the GNU General Public License version
     18  * 2 along with this work; if not, write to the Free Software Foundation,
     19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     20  *
     21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     22  * or visit www.oracle.com if you need additional information or have any
     23  * questions.
     24  */
     25 
     26 package java.util;
     27 
     28 import java.util.function.Consumer;
     29 
     30 /**
     31  * Doubly-linked list implementation of the {@code List} and {@code Deque}
     32  * interfaces.  Implements all optional list operations, and permits all
     33  * elements (including {@code null}).
     34  *
     35  * <p>All of the operations perform as could be expected for a doubly-linked
     36  * list.  Operations that index into the list will traverse the list from
     37  * the beginning or the end, whichever is closer to the specified index.
     38  *
     39  * <p><strong>Note that this implementation is not synchronized.</strong>
     40  * If multiple threads access a linked list concurrently, and at least
     41  * one of the threads modifies the list structurally, it <i>must</i> be
     42  * synchronized externally.  (A structural modification is any operation
     43  * that adds or deletes one or more elements; merely setting the value of
     44  * an element is not a structural modification.)  This is typically
     45  * accomplished by synchronizing on some object that naturally
     46  * encapsulates the list.
     47  *
     48  * If no such object exists, the list should be "wrapped" using the
     49  * {@link Collections#synchronizedList Collections.synchronizedList}
     50  * method.  This is best done at creation time, to prevent accidental
     51  * unsynchronized access to the list:<pre>
     52  *   List list = Collections.synchronizedList(new LinkedList(...));</pre>
     53  *
     54  * <p>The iterators returned by this class's {@code iterator} and
     55  * {@code listIterator} methods are <i>fail-fast</i>: if the list is
     56  * structurally modified at any time after the iterator is created, in
     57  * any way except through the Iterator's own {@code remove} or
     58  * {@code add} methods, the iterator will throw a {@link
     59  * ConcurrentModificationException}.  Thus, in the face of concurrent
     60  * modification, the iterator fails quickly and cleanly, rather than
     61  * risking arbitrary, non-deterministic behavior at an undetermined
     62  * time in the future.
     63  *
     64  * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
     65  * as it is, generally speaking, impossible to make any hard guarantees in the
     66  * presence of unsynchronized concurrent modification.  Fail-fast iterators
     67  * throw {@code ConcurrentModificationException} on a best-effort basis.
     68  * Therefore, it would be wrong to write a program that depended on this
     69  * exception for its correctness:   <i>the fail-fast behavior of iterators
     70  * should be used only to detect bugs.</i>
     71  *
     72  * <p>This class is a member of the
     73  * <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/collections/index.html">
     74  * Java Collections Framework</a>.
     75  *
     76  * @author  Josh Bloch
     77  * @see     List
     78  * @see     ArrayList
     79  * @since 1.2
     80  * @param <E> the type of elements held in this collection
     81  */
     82 
     83 public class LinkedList<E>
     84     extends AbstractSequentialList<E>
     85     implements List<E>, Deque<E>, Cloneable, java.io.Serializable
     86 {
     87     transient int size = 0;
     88 
     89     /**
     90      * Pointer to first node.
     91      * Invariant: (first == null && last == null) ||
     92      *            (first.prev == null && first.item != null)
     93      */
     94     transient Node<E> first;
     95 
     96     /**
     97      * Pointer to last node.
     98      * Invariant: (first == null && last == null) ||
     99      *            (last.next == null && last.item != null)
    100      */
    101     transient Node<E> last;
    102 
    103     /**
    104      * Constructs an empty list.
    105      */
    106     public LinkedList() {
    107     }
    108 
    109     /**
    110      * Constructs a list containing the elements of the specified
    111      * collection, in the order they are returned by the collection's
    112      * iterator.
    113      *
    114      * @param  c the collection whose elements are to be placed into this list
    115      * @throws NullPointerException if the specified collection is null
    116      */
    117     public LinkedList(Collection<? extends E> c) {
    118         this();
    119         addAll(c);
    120     }
    121 
    122     /**
    123      * Links e as first element.
    124      */
    125     private void linkFirst(E e) {
    126         final Node<E> f = first;
    127         final Node<E> newNode = new Node<>(null, e, f);
    128         first = newNode;
    129         if (f == null)
    130             last = newNode;
    131         else
    132             f.prev = newNode;
    133         size++;
    134         modCount++;
    135     }
    136 
    137     /**
    138      * Links e as last element.
    139      */
    140     void linkLast(E e) {
    141         final Node<E> l = last;
    142         final Node<E> newNode = new Node<>(l, e, null);
    143         last = newNode;
    144         if (l == null)
    145             first = newNode;
    146         else
    147             l.next = newNode;
    148         size++;
    149         modCount++;
    150     }
    151 
    152     /**
    153      * Inserts element e before non-null Node succ.
    154      */
    155     void linkBefore(E e, Node<E> succ) {
    156         // assert succ != null;
    157         final Node<E> pred = succ.prev;
    158         final Node<E> newNode = new Node<>(pred, e, succ);
    159         succ.prev = newNode;
    160         if (pred == null)
    161             first = newNode;
    162         else
    163             pred.next = newNode;
    164         size++;
    165         modCount++;
    166     }
    167 
    168     /**
    169      * Unlinks non-null first node f.
    170      */
    171     private E unlinkFirst(Node<E> f) {
    172         // assert f == first && f != null;
    173         final E element = f.item;
    174         final Node<E> next = f.next;
    175         f.item = null;
    176         f.next = null; // help GC
    177         first = next;
    178         if (next == null)
    179             last = null;
    180         else
    181             next.prev = null;
    182         size--;
    183         modCount++;
    184         return element;
    185     }
    186 
    187     /**
    188      * Unlinks non-null last node l.
    189      */
    190     private E unlinkLast(Node<E> l) {
    191         // assert l == last && l != null;
    192         final E element = l.item;
    193         final Node<E> prev = l.prev;
    194         l.item = null;
    195         l.prev = null; // help GC
    196         last = prev;
    197         if (prev == null)
    198             first = null;
    199         else
    200             prev.next = null;
    201         size--;
    202         modCount++;
    203         return element;
    204     }
    205 
    206     /**
    207      * Unlinks non-null node x.
    208      */
    209     E unlink(Node<E> x) {
    210         // assert x != null;
    211         final E element = x.item;
    212         final Node<E> next = x.next;
    213         final Node<E> prev = x.prev;
    214 
    215         if (prev == null) {
    216             first = next;
    217         } else {
    218             prev.next = next;
    219             x.prev = null;
    220         }
    221 
    222         if (next == null) {
    223             last = prev;
    224         } else {
    225             next.prev = prev;
    226             x.next = null;
    227         }
    228 
    229         x.item = null;
    230         size--;
    231         modCount++;
    232         return element;
    233     }
    234 
    235     /**
    236      * Returns the first element in this list.
    237      *
    238      * @return the first element in this list
    239      * @throws NoSuchElementException if this list is empty
    240      */
    241     public E getFirst() {
    242         final Node<E> f = first;
    243         if (f == null)
    244             throw new NoSuchElementException();
    245         return f.item;
    246     }
    247 
    248     /**
    249      * Returns the last element in this list.
    250      *
    251      * @return the last element in this list
    252      * @throws NoSuchElementException if this list is empty
    253      */
    254     public E getLast() {
    255         final Node<E> l = last;
    256         if (l == null)
    257             throw new NoSuchElementException();
    258         return l.item;
    259     }
    260 
    261     /**
    262      * Removes and returns the first element from this list.
    263      *
    264      * @return the first element from this list
    265      * @throws NoSuchElementException if this list is empty
    266      */
    267     public E removeFirst() {
    268         final Node<E> f = first;
    269         if (f == null)
    270             throw new NoSuchElementException();
    271         return unlinkFirst(f);
    272     }
    273 
    274     /**
    275      * Removes and returns the last element from this list.
    276      *
    277      * @return the last element from this list
    278      * @throws NoSuchElementException if this list is empty
    279      */
    280     public E removeLast() {
    281         final Node<E> l = last;
    282         if (l == null)
    283             throw new NoSuchElementException();
    284         return unlinkLast(l);
    285     }
    286 
    287     /**
    288      * Inserts the specified element at the beginning of this list.
    289      *
    290      * @param e the element to add
    291      */
    292     public void addFirst(E e) {
    293         linkFirst(e);
    294     }
    295 
    296     /**
    297      * Appends the specified element to the end of this list.
    298      *
    299      * <p>This method is equivalent to {@link #add}.
    300      *
    301      * @param e the element to add
    302      */
    303     public void addLast(E e) {
    304         linkLast(e);
    305     }
    306 
    307     /**
    308      * Returns {@code true} if this list contains the specified element.
    309      * More formally, returns {@code true} if and only if this list contains
    310      * at least one element {@code e} such that
    311      * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
    312      *
    313      * @param o element whose presence in this list is to be tested
    314      * @return {@code true} if this list contains the specified element
    315      */
    316     public boolean contains(Object o) {
    317         return indexOf(o) != -1;
    318     }
    319 
    320     /**
    321      * Returns the number of elements in this list.
    322      *
    323      * @return the number of elements in this list
    324      */
    325     public int size() {
    326         return size;
    327     }
    328 
    329     /**
    330      * Appends the specified element to the end of this list.
    331      *
    332      * <p>This method is equivalent to {@link #addLast}.
    333      *
    334      * @param e element to be appended to this list
    335      * @return {@code true} (as specified by {@link Collection#add})
    336      */
    337     public boolean add(E e) {
    338         linkLast(e);
    339         return true;
    340     }
    341 
    342     /**
    343      * Removes the first occurrence of the specified element from this list,
    344      * if it is present.  If this list does not contain the element, it is
    345      * unchanged.  More formally, removes the element with the lowest index
    346      * {@code i} such that
    347      * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>
    348      * (if such an element exists).  Returns {@code true} if this list
    349      * contained the specified element (or equivalently, if this list
    350      * changed as a result of the call).
    351      *
    352      * @param o element to be removed from this list, if present
    353      * @return {@code true} if this list contained the specified element
    354      */
    355     public boolean remove(Object o) {
    356         if (o == null) {
    357             for (Node<E> x = first; x != null; x = x.next) {
    358                 if (x.item == null) {
    359                     unlink(x);
    360                     return true;
    361                 }
    362             }
    363         } else {
    364             for (Node<E> x = first; x != null; x = x.next) {
    365                 if (o.equals(x.item)) {
    366                     unlink(x);
    367                     return true;
    368                 }
    369             }
    370         }
    371         return false;
    372     }
    373 
    374     /**
    375      * Appends all of the elements in the specified collection to the end of
    376      * this list, in the order that they are returned by the specified
    377      * collection's iterator.  The behavior of this operation is undefined if
    378      * the specified collection is modified while the operation is in
    379      * progress.  (Note that this will occur if the specified collection is
    380      * this list, and it's nonempty.)
    381      *
    382      * @param c collection containing elements to be added to this list
    383      * @return {@code true} if this list changed as a result of the call
    384      * @throws NullPointerException if the specified collection is null
    385      */
    386     public boolean addAll(Collection<? extends E> c) {
    387         return addAll(size, c);
    388     }
    389 
    390     /**
    391      * Inserts all of the elements in the specified collection into this
    392      * list, starting at the specified position.  Shifts the element
    393      * currently at that position (if any) and any subsequent elements to
    394      * the right (increases their indices).  The new elements will appear
    395      * in the list in the order that they are returned by the
    396      * specified collection's iterator.
    397      *
    398      * @param index index at which to insert the first element
    399      *              from the specified collection
    400      * @param c collection containing elements to be added to this list
    401      * @return {@code true} if this list changed as a result of the call
    402      * @throws IndexOutOfBoundsException {@inheritDoc}
    403      * @throws NullPointerException if the specified collection is null
    404      */
    405     public boolean addAll(int index, Collection<? extends E> c) {
    406         checkPositionIndex(index);
    407 
    408         Object[] a = c.toArray();
    409         int numNew = a.length;
    410         if (numNew == 0)
    411             return false;
    412 
    413         Node<E> pred, succ;
    414         if (index == size) {
    415             succ = null;
    416             pred = last;
    417         } else {
    418             succ = node(index);
    419             pred = succ.prev;
    420         }
    421 
    422         for (Object o : a) {
    423             @SuppressWarnings("unchecked") E e = (E) o;
    424             Node<E> newNode = new Node<>(pred, e, null);
    425             if (pred == null)
    426                 first = newNode;
    427             else
    428                 pred.next = newNode;
    429             pred = newNode;
    430         }
    431 
    432         if (succ == null) {
    433             last = pred;
    434         } else {
    435             pred.next = succ;
    436             succ.prev = pred;
    437         }
    438 
    439         size += numNew;
    440         modCount++;
    441         return true;
    442     }
    443 
    444     /**
    445      * Removes all of the elements from this list.
    446      * The list will be empty after this call returns.
    447      */
    448     public void clear() {
    449         // Clearing all of the links between nodes is "unnecessary", but:
    450         // - helps a generational GC if the discarded nodes inhabit
    451         //   more than one generation
    452         // - is sure to free memory even if there is a reachable Iterator
    453         for (Node<E> x = first; x != null; ) {
    454             Node<E> next = x.next;
    455             x.item = null;
    456             x.next = null;
    457             x.prev = null;
    458             x = next;
    459         }
    460         first = last = null;
    461         size = 0;
    462         modCount++;
    463     }
    464 
    465 
    466     // Positional Access Operations
    467 
    468     /**
    469      * Returns the element at the specified position in this list.
    470      *
    471      * @param index index of the element to return
    472      * @return the element at the specified position in this list
    473      * @throws IndexOutOfBoundsException {@inheritDoc}
    474      */
    475     public E get(int index) {
    476         checkElementIndex(index);
    477         return node(index).item;
    478     }
    479 
    480     /**
    481      * Replaces the element at the specified position in this list with the
    482      * specified element.
    483      *
    484      * @param index index of the element to replace
    485      * @param element element to be stored at the specified position
    486      * @return the element previously at the specified position
    487      * @throws IndexOutOfBoundsException {@inheritDoc}
    488      */
    489     public E set(int index, E element) {
    490         checkElementIndex(index);
    491         Node<E> x = node(index);
    492         E oldVal = x.item;
    493         x.item = element;
    494         return oldVal;
    495     }
    496 
    497     /**
    498      * Inserts the specified element at the specified position in this list.
    499      * Shifts the element currently at that position (if any) and any
    500      * subsequent elements to the right (adds one to their indices).
    501      *
    502      * @param index index at which the specified element is to be inserted
    503      * @param element element to be inserted
    504      * @throws IndexOutOfBoundsException {@inheritDoc}
    505      */
    506     public void add(int index, E element) {
    507         checkPositionIndex(index);
    508 
    509         if (index == size)
    510             linkLast(element);
    511         else
    512             linkBefore(element, node(index));
    513     }
    514 
    515     /**
    516      * Removes the element at the specified position in this list.  Shifts any
    517      * subsequent elements to the left (subtracts one from their indices).
    518      * Returns the element that was removed from the list.
    519      *
    520      * @param index the index of the element to be removed
    521      * @return the element previously at the specified position
    522      * @throws IndexOutOfBoundsException {@inheritDoc}
    523      */
    524     public E remove(int index) {
    525         checkElementIndex(index);
    526         return unlink(node(index));
    527     }
    528 
    529     /**
    530      * Tells if the argument is the index of an existing element.
    531      */
    532     private boolean isElementIndex(int index) {
    533         return index >= 0 && index < size;
    534     }
    535 
    536     /**
    537      * Tells if the argument is the index of a valid position for an
    538      * iterator or an add operation.
    539      */
    540     private boolean isPositionIndex(int index) {
    541         return index >= 0 && index <= size;
    542     }
    543 
    544     /**
    545      * Constructs an IndexOutOfBoundsException detail message.
    546      * Of the many possible refactorings of the error handling code,
    547      * this "outlining" performs best with both server and client VMs.
    548      */
    549     private String outOfBoundsMsg(int index) {
    550         return "Index: "+index+", Size: "+size;
    551     }
    552 
    553     private void checkElementIndex(int index) {
    554         if (!isElementIndex(index))
    555             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    556     }
    557 
    558     private void checkPositionIndex(int index) {
    559         if (!isPositionIndex(index))
    560             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    561     }
    562 
    563     /**
    564      * Returns the (non-null) Node at the specified element index.
    565      */
    566     Node<E> node(int index) {
    567         // assert isElementIndex(index);
    568 
    569         if (index < (size >> 1)) {
    570             Node<E> x = first;
    571             for (int i = 0; i < index; i++)
    572                 x = x.next;
    573             return x;
    574         } else {
    575             Node<E> x = last;
    576             for (int i = size - 1; i > index; i--)
    577                 x = x.prev;
    578             return x;
    579         }
    580     }
    581 
    582     // Search Operations
    583 
    584     /**
    585      * Returns the index of the first occurrence of the specified element
    586      * in this list, or -1 if this list does not contain the element.
    587      * More formally, returns the lowest index {@code i} such that
    588      * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
    589      * or -1 if there is no such index.
    590      *
    591      * @param o element to search for
    592      * @return the index of the first occurrence of the specified element in
    593      *         this list, or -1 if this list does not contain the element
    594      */
    595     public int indexOf(Object o) {
    596         int index = 0;
    597         if (o == null) {
    598             for (Node<E> x = first; x != null; x = x.next) {
    599                 if (x.item == null)
    600                     return index;
    601                 index++;
    602             }
    603         } else {
    604             for (Node<E> x = first; x != null; x = x.next) {
    605                 if (o.equals(x.item))
    606                     return index;
    607                 index++;
    608             }
    609         }
    610         return -1;
    611     }
    612 
    613     /**
    614      * Returns the index of the last occurrence of the specified element
    615      * in this list, or -1 if this list does not contain the element.
    616      * More formally, returns the highest index {@code i} such that
    617      * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
    618      * or -1 if there is no such index.
    619      *
    620      * @param o element to search for
    621      * @return the index of the last occurrence of the specified element in
    622      *         this list, or -1 if this list does not contain the element
    623      */
    624     public int lastIndexOf(Object o) {
    625         int index = size;
    626         if (o == null) {
    627             for (Node<E> x = last; x != null; x = x.prev) {
    628                 index--;
    629                 if (x.item == null)
    630                     return index;
    631             }
    632         } else {
    633             for (Node<E> x = last; x != null; x = x.prev) {
    634                 index--;
    635                 if (o.equals(x.item))
    636                     return index;
    637             }
    638         }
    639         return -1;
    640     }
    641 
    642     // Queue operations.
    643 
    644     /**
    645      * Retrieves, but does not remove, the head (first element) of this list.
    646      *
    647      * @return the head of this list, or {@code null} if this list is empty
    648      * @since 1.5
    649      */
    650     public E peek() {
    651         final Node<E> f = first;
    652         return (f == null) ? null : f.item;
    653     }
    654 
    655     /**
    656      * Retrieves, but does not remove, the head (first element) of this list.
    657      *
    658      * @return the head of this list
    659      * @throws NoSuchElementException if this list is empty
    660      * @since 1.5
    661      */
    662     public E element() {
    663         return getFirst();
    664     }
    665 
    666     /**
    667      * Retrieves and removes the head (first element) of this list.
    668      *
    669      * @return the head of this list, or {@code null} if this list is empty
    670      * @since 1.5
    671      */
    672     public E poll() {
    673         final Node<E> f = first;
    674         return (f == null) ? null : unlinkFirst(f);
    675     }
    676 
    677     /**
    678      * Retrieves and removes the head (first element) of this list.
    679      *
    680      * @return the head of this list
    681      * @throws NoSuchElementException if this list is empty
    682      * @since 1.5
    683      */
    684     public E remove() {
    685         return removeFirst();
    686     }
    687 
    688     /**
    689      * Adds the specified element as the tail (last element) of this list.
    690      *
    691      * @param e the element to add
    692      * @return {@code true} (as specified by {@link Queue#offer})
    693      * @since 1.5
    694      */
    695     public boolean offer(E e) {
    696         return add(e);
    697     }
    698 
    699     // Deque operations
    700     /**
    701      * Inserts the specified element at the front of this list.
    702      *
    703      * @param e the element to insert
    704      * @return {@code true} (as specified by {@link Deque#offerFirst})
    705      * @since 1.6
    706      */
    707     public boolean offerFirst(E e) {
    708         addFirst(e);
    709         return true;
    710     }
    711 
    712     /**
    713      * Inserts the specified element at the end of this list.
    714      *
    715      * @param e the element to insert
    716      * @return {@code true} (as specified by {@link Deque#offerLast})
    717      * @since 1.6
    718      */
    719     public boolean offerLast(E e) {
    720         addLast(e);
    721         return true;
    722     }
    723 
    724     /**
    725      * Retrieves, but does not remove, the first element of this list,
    726      * or returns {@code null} if this list is empty.
    727      *
    728      * @return the first element of this list, or {@code null}
    729      *         if this list is empty
    730      * @since 1.6
    731      */
    732     public E peekFirst() {
    733         final Node<E> f = first;
    734         return (f == null) ? null : f.item;
    735      }
    736 
    737     /**
    738      * Retrieves, but does not remove, the last element of this list,
    739      * or returns {@code null} if this list is empty.
    740      *
    741      * @return the last element of this list, or {@code null}
    742      *         if this list is empty
    743      * @since 1.6
    744      */
    745     public E peekLast() {
    746         final Node<E> l = last;
    747         return (l == null) ? null : l.item;
    748     }
    749 
    750     /**
    751      * Retrieves and removes the first element of this list,
    752      * or returns {@code null} if this list is empty.
    753      *
    754      * @return the first element of this list, or {@code null} if
    755      *     this list is empty
    756      * @since 1.6
    757      */
    758     public E pollFirst() {
    759         final Node<E> f = first;
    760         return (f == null) ? null : unlinkFirst(f);
    761     }
    762 
    763     /**
    764      * Retrieves and removes the last element of this list,
    765      * or returns {@code null} if this list is empty.
    766      *
    767      * @return the last element of this list, or {@code null} if
    768      *     this list is empty
    769      * @since 1.6
    770      */
    771     public E pollLast() {
    772         final Node<E> l = last;
    773         return (l == null) ? null : unlinkLast(l);
    774     }
    775 
    776     /**
    777      * Pushes an element onto the stack represented by this list.  In other
    778      * words, inserts the element at the front of this list.
    779      *
    780      * <p>This method is equivalent to {@link #addFirst}.
    781      *
    782      * @param e the element to push
    783      * @since 1.6
    784      */
    785     public void push(E e) {
    786         addFirst(e);
    787     }
    788 
    789     /**
    790      * Pops an element from the stack represented by this list.  In other
    791      * words, removes and returns the first element of this list.
    792      *
    793      * <p>This method is equivalent to {@link #removeFirst()}.
    794      *
    795      * @return the element at the front of this list (which is the top
    796      *         of the stack represented by this list)
    797      * @throws NoSuchElementException if this list is empty
    798      * @since 1.6
    799      */
    800     public E pop() {
    801         return removeFirst();
    802     }
    803 
    804     /**
    805      * Removes the first occurrence of the specified element in this
    806      * list (when traversing the list from head to tail).  If the list
    807      * does not contain the element, it is unchanged.
    808      *
    809      * @param o element to be removed from this list, if present
    810      * @return {@code true} if the list contained the specified element
    811      * @since 1.6
    812      */
    813     public boolean removeFirstOccurrence(Object o) {
    814         return remove(o);
    815     }
    816 
    817     /**
    818      * Removes the last occurrence of the specified element in this
    819      * list (when traversing the list from head to tail).  If the list
    820      * does not contain the element, it is unchanged.
    821      *
    822      * @param o element to be removed from this list, if present
    823      * @return {@code true} if the list contained the specified element
    824      * @since 1.6
    825      */
    826     public boolean removeLastOccurrence(Object o) {
    827         if (o == null) {
    828             for (Node<E> x = last; x != null; x = x.prev) {
    829                 if (x.item == null) {
    830                     unlink(x);
    831                     return true;
    832                 }
    833             }
    834         } else {
    835             for (Node<E> x = last; x != null; x = x.prev) {
    836                 if (o.equals(x.item)) {
    837                     unlink(x);
    838                     return true;
    839                 }
    840             }
    841         }
    842         return false;
    843     }
    844 
    845     /**
    846      * Returns a list-iterator of the elements in this list (in proper
    847      * sequence), starting at the specified position in the list.
    848      * Obeys the general contract of {@code List.listIterator(int)}.<p>
    849      *
    850      * The list-iterator is <i>fail-fast</i>: if the list is structurally
    851      * modified at any time after the Iterator is created, in any way except
    852      * through the list-iterator's own {@code remove} or {@code add}
    853      * methods, the list-iterator will throw a
    854      * {@code ConcurrentModificationException}.  Thus, in the face of
    855      * concurrent modification, the iterator fails quickly and cleanly, rather
    856      * than risking arbitrary, non-deterministic behavior at an undetermined
    857      * time in the future.
    858      *
    859      * @param index index of the first element to be returned from the
    860      *              list-iterator (by a call to {@code next})
    861      * @return a ListIterator of the elements in this list (in proper
    862      *         sequence), starting at the specified position in the list
    863      * @throws IndexOutOfBoundsException {@inheritDoc}
    864      * @see List#listIterator(int)
    865      */
    866     public ListIterator<E> listIterator(int index) {
    867         checkPositionIndex(index);
    868         return new ListItr(index);
    869     }
    870 
    871     private class ListItr implements ListIterator<E> {
    872         private Node<E> lastReturned;
    873         private Node<E> next;
    874         private int nextIndex;
    875         private int expectedModCount = modCount;
    876 
    877         ListItr(int index) {
    878             // assert isPositionIndex(index);
    879             next = (index == size) ? null : node(index);
    880             nextIndex = index;
    881         }
    882 
    883         public boolean hasNext() {
    884             return nextIndex < size;
    885         }
    886 
    887         public E next() {
    888             checkForComodification();
    889             if (!hasNext())
    890                 throw new NoSuchElementException();
    891 
    892             lastReturned = next;
    893             next = next.next;
    894             nextIndex++;
    895             return lastReturned.item;
    896         }
    897 
    898         public boolean hasPrevious() {
    899             return nextIndex > 0;
    900         }
    901 
    902         public E previous() {
    903             checkForComodification();
    904             if (!hasPrevious())
    905                 throw new NoSuchElementException();
    906 
    907             lastReturned = next = (next == null) ? last : next.prev;
    908             nextIndex--;
    909             return lastReturned.item;
    910         }
    911 
    912         public int nextIndex() {
    913             return nextIndex;
    914         }
    915 
    916         public int previousIndex() {
    917             return nextIndex - 1;
    918         }
    919 
    920         public void remove() {
    921             checkForComodification();
    922             if (lastReturned == null)
    923                 throw new IllegalStateException();
    924 
    925             Node<E> lastNext = lastReturned.next;
    926             unlink(lastReturned);
    927             if (next == lastReturned)
    928                 next = lastNext;
    929             else
    930                 nextIndex--;
    931             lastReturned = null;
    932             expectedModCount++;
    933         }
    934 
    935         public void set(E e) {
    936             if (lastReturned == null)
    937                 throw new IllegalStateException();
    938             checkForComodification();
    939             lastReturned.item = e;
    940         }
    941 
    942         public void add(E e) {
    943             checkForComodification();
    944             lastReturned = null;
    945             if (next == null)
    946                 linkLast(e);
    947             else
    948                 linkBefore(e, next);
    949             nextIndex++;
    950             expectedModCount++;
    951         }
    952 
    953         public void forEachRemaining(Consumer<? super E> action) {
    954             Objects.requireNonNull(action);
    955             while (modCount == expectedModCount && nextIndex < size) {
    956                 action.accept(next.item);
    957                 lastReturned = next;
    958                 next = next.next;
    959                 nextIndex++;
    960             }
    961             checkForComodification();
    962         }
    963 
    964         final void checkForComodification() {
    965             if (modCount != expectedModCount)
    966                 throw new ConcurrentModificationException();
    967         }
    968     }
    969 
    970     private static class Node<E> {
    971         E item;
    972         Node<E> next;
    973         Node<E> prev;
    974 
    975         Node(Node<E> prev, E element, Node<E> next) {
    976             this.item = element;
    977             this.next = next;
    978             this.prev = prev;
    979         }
    980     }
    981 
    982     /**
    983      * @since 1.6
    984      */
    985     public Iterator<E> descendingIterator() {
    986         return new DescendingIterator();
    987     }
    988 
    989     /**
    990      * Adapter to provide descending iterators via ListItr.previous
    991      */
    992     private class DescendingIterator implements Iterator<E> {
    993         private final ListItr itr = new ListItr(size());
    994         public boolean hasNext() {
    995             return itr.hasPrevious();
    996         }
    997         public E next() {
    998             return itr.previous();
    999         }
   1000         public void remove() {
   1001             itr.remove();
   1002         }
   1003     }
   1004 
   1005     @SuppressWarnings("unchecked")
   1006     private LinkedList<E> superClone() {
   1007         try {
   1008             return (LinkedList<E>) super.clone();
   1009         } catch (CloneNotSupportedException e) {
   1010             throw new InternalError(e);
   1011         }
   1012     }
   1013 
   1014     /**
   1015      * Returns a shallow copy of this {@code LinkedList}. (The elements
   1016      * themselves are not cloned.)
   1017      *
   1018      * @return a shallow copy of this {@code LinkedList} instance
   1019      */
   1020     public Object clone() {
   1021         LinkedList<E> clone = superClone();
   1022 
   1023         // Put clone into "virgin" state
   1024         clone.first = clone.last = null;
   1025         clone.size = 0;
   1026         clone.modCount = 0;
   1027 
   1028         // Initialize clone with our elements
   1029         for (Node<E> x = first; x != null; x = x.next)
   1030             clone.add(x.item);
   1031 
   1032         return clone;
   1033     }
   1034 
   1035     /**
   1036      * Returns an array containing all of the elements in this list
   1037      * in proper sequence (from first to last element).
   1038      *
   1039      * <p>The returned array will be "safe" in that no references to it are
   1040      * maintained by this list.  (In other words, this method must allocate
   1041      * a new array).  The caller is thus free to modify the returned array.
   1042      *
   1043      * <p>This method acts as bridge between array-based and collection-based
   1044      * APIs.
   1045      *
   1046      * @return an array containing all of the elements in this list
   1047      *         in proper sequence
   1048      */
   1049     public Object[] toArray() {
   1050         Object[] result = new Object[size];
   1051         int i = 0;
   1052         for (Node<E> x = first; x != null; x = x.next)
   1053             result[i++] = x.item;
   1054         return result;
   1055     }
   1056 
   1057     /**
   1058      * Returns an array containing all of the elements in this list in
   1059      * proper sequence (from first to last element); the runtime type of
   1060      * the returned array is that of the specified array.  If the list fits
   1061      * in the specified array, it is returned therein.  Otherwise, a new
   1062      * array is allocated with the runtime type of the specified array and
   1063      * the size of this list.
   1064      *
   1065      * <p>If the list fits in the specified array with room to spare (i.e.,
   1066      * the array has more elements than the list), the element in the array
   1067      * immediately following the end of the list is set to {@code null}.
   1068      * (This is useful in determining the length of the list <i>only</i> if
   1069      * the caller knows that the list does not contain any null elements.)
   1070      *
   1071      * <p>Like the {@link #toArray()} method, this method acts as bridge between
   1072      * array-based and collection-based APIs.  Further, this method allows
   1073      * precise control over the runtime type of the output array, and may,
   1074      * under certain circumstances, be used to save allocation costs.
   1075      *
   1076      * <p>Suppose {@code x} is a list known to contain only strings.
   1077      * The following code can be used to dump the list into a newly
   1078      * allocated array of {@code String}:
   1079      *
   1080      * <pre>
   1081      *     String[] y = x.toArray(new String[0]);</pre>
   1082      *
   1083      * Note that {@code toArray(new Object[0])} is identical in function to
   1084      * {@code toArray()}.
   1085      *
   1086      * @param a the array into which the elements of the list are to
   1087      *          be stored, if it is big enough; otherwise, a new array of the
   1088      *          same runtime type is allocated for this purpose.
   1089      * @return an array containing the elements of the list
   1090      * @throws ArrayStoreException if the runtime type of the specified array
   1091      *         is not a supertype of the runtime type of every element in
   1092      *         this list
   1093      * @throws NullPointerException if the specified array is null
   1094      */
   1095     @SuppressWarnings("unchecked")
   1096     public <T> T[] toArray(T[] a) {
   1097         if (a.length < size)
   1098             a = (T[])java.lang.reflect.Array.newInstance(
   1099                                 a.getClass().getComponentType(), size);
   1100         int i = 0;
   1101         Object[] result = a;
   1102         for (Node<E> x = first; x != null; x = x.next)
   1103             result[i++] = x.item;
   1104 
   1105         if (a.length > size)
   1106             a[size] = null;
   1107 
   1108         return a;
   1109     }
   1110 
   1111     private static final long serialVersionUID = 876323262645176354L;
   1112 
   1113     /**
   1114      * Saves the state of this {@code LinkedList} instance to a stream
   1115      * (that is, serializes it).
   1116      *
   1117      * @serialData The size of the list (the number of elements it
   1118      *             contains) is emitted (int), followed by all of its
   1119      *             elements (each an Object) in the proper order.
   1120      */
   1121     private void writeObject(java.io.ObjectOutputStream s)
   1122         throws java.io.IOException {
   1123         // Write out any hidden serialization magic
   1124         s.defaultWriteObject();
   1125 
   1126         // Write out size
   1127         s.writeInt(size);
   1128 
   1129         // Write out all elements in the proper order.
   1130         for (Node<E> x = first; x != null; x = x.next)
   1131             s.writeObject(x.item);
   1132     }
   1133 
   1134     /**
   1135      * Reconstitutes this {@code LinkedList} instance from a stream
   1136      * (that is, deserializes it).
   1137      */
   1138     @SuppressWarnings("unchecked")
   1139     private void readObject(java.io.ObjectInputStream s)
   1140         throws java.io.IOException, ClassNotFoundException {
   1141         // Read in any hidden serialization magic
   1142         s.defaultReadObject();
   1143 
   1144         // Read in size
   1145         int size = s.readInt();
   1146 
   1147         // Read in all elements in the proper order.
   1148         for (int i = 0; i < size; i++)
   1149             linkLast((E)s.readObject());
   1150     }
   1151 
   1152     /**
   1153      * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em>
   1154      * and <em>fail-fast</em> {@link Spliterator} over the elements in this
   1155      * list.
   1156      *
   1157      * <p>The {@code Spliterator} reports {@link Spliterator#SIZED} and
   1158      * {@link Spliterator#ORDERED}.  Overriding implementations should document
   1159      * the reporting of additional characteristic values.
   1160      *
   1161      * @implNote
   1162      * The {@code Spliterator} additionally reports {@link Spliterator#SUBSIZED}
   1163      * and implements {@code trySplit} to permit limited parallelism..
   1164      *
   1165      * @return a {@code Spliterator} over the elements in this list
   1166      * @since 1.8
   1167      */
   1168     @Override
   1169     public Spliterator<E> spliterator() {
   1170         return new LLSpliterator<E>(this, -1, 0);
   1171     }
   1172 
   1173     /** A customized variant of Spliterators.IteratorSpliterator */
   1174     static final class LLSpliterator<E> implements Spliterator<E> {
   1175         static final int BATCH_UNIT = 1 << 10;  // batch array size increment
   1176         static final int MAX_BATCH = 1 << 25;  // max batch array size;
   1177         final LinkedList<E> list; // null OK unless traversed
   1178         Node<E> current;      // current node; null until initialized
   1179         int est;              // size estimate; -1 until first needed
   1180         int expectedModCount; // initialized when est set
   1181         int batch;            // batch size for splits
   1182 
   1183         LLSpliterator(LinkedList<E> list, int est, int expectedModCount) {
   1184             this.list = list;
   1185             this.est = est;
   1186             this.expectedModCount = expectedModCount;
   1187         }
   1188 
   1189         final int getEst() {
   1190             int s; // force initialization
   1191             final LinkedList<E> lst;
   1192             if ((s = est) < 0) {
   1193                 if ((lst = list) == null)
   1194                     s = est = 0;
   1195                 else {
   1196                     expectedModCount = lst.modCount;
   1197                     current = lst.first;
   1198                     s = est = lst.size;
   1199                 }
   1200             }
   1201             return s;
   1202         }
   1203 
   1204         public long estimateSize() { return (long) getEst(); }
   1205 
   1206         public Spliterator<E> trySplit() {
   1207             Node<E> p;
   1208             int s = getEst();
   1209             if (s > 1 && (p = current) != null) {
   1210                 int n = batch + BATCH_UNIT;
   1211                 if (n > s)
   1212                     n = s;
   1213                 if (n > MAX_BATCH)
   1214                     n = MAX_BATCH;
   1215                 Object[] a = new Object[n];
   1216                 int j = 0;
   1217                 do { a[j++] = p.item; } while ((p = p.next) != null && j < n);
   1218                 current = p;
   1219                 batch = j;
   1220                 est = s - j;
   1221                 return Spliterators.spliterator(a, 0, j, Spliterator.ORDERED);
   1222             }
   1223             return null;
   1224         }
   1225 
   1226         public void forEachRemaining(Consumer<? super E> action) {
   1227             Node<E> p; int n;
   1228             if (action == null) throw new NullPointerException();
   1229             if ((n = getEst()) > 0 && (p = current) != null) {
   1230                 current = null;
   1231                 est = 0;
   1232                 do {
   1233                     E e = p.item;
   1234                     p = p.next;
   1235                     action.accept(e);
   1236                 } while (p != null && --n > 0);
   1237             }
   1238             if (list.modCount != expectedModCount)
   1239                 throw new ConcurrentModificationException();
   1240         }
   1241 
   1242         public boolean tryAdvance(Consumer<? super E> action) {
   1243             Node<E> p;
   1244             if (action == null) throw new NullPointerException();
   1245             if (getEst() > 0 && (p = current) != null) {
   1246                 --est;
   1247                 E e = p.item;
   1248                 current = p.next;
   1249                 action.accept(e);
   1250                 if (list.modCount != expectedModCount)
   1251                     throw new ConcurrentModificationException();
   1252                 return true;
   1253             }
   1254             return false;
   1255         }
   1256 
   1257         public int characteristics() {
   1258             return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED;
   1259         }
   1260     }
   1261 
   1262 }
   1263