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