ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/main/java/util/LinkedList.java
(Generate patch)

Comparing jsr166/src/main/java/util/LinkedList.java (file contents):
Revision 1.18 by dl, Tue Dec 28 16:15:36 2004 UTC vs.
Revision 1.43 by jsr166, Tue Jan 10 21:32:09 2006 UTC

# Line 1 | Line 1
1   /*
2   * %W% %E%
3   *
4 < * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
4 > * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
5   * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
6   */
7  
8 < package java.util;
8 > package java.util;
9 > import java.util.*; // for javadoc (till 6280605 is fixed)
10  
11   /**
12   * Linked list implementation of the <tt>List</tt> interface.  Implements all
# Line 14 | Line 15 | package java.util;
15   * the <tt>LinkedList</tt> class provides uniformly named methods to
16   * <tt>get</tt>, <tt>remove</tt> and <tt>insert</tt> an element at the
17   * beginning and end of the list.  These operations allow linked lists to be
18 < * used as a stack, queue, or double-ended queue ({@link Deque}).<p>
18 > * used as a stack, {@linkplain Queue queue}, or {@linkplain Deque
19 > * double-ended queue}. <p>
20   *
21   * The class implements the <tt>Deque</tt> interface, providing
22   * first-in-first-out queue operations for <tt>add</tt>,
23 < * <tt>poll</tt>, along with other stack and deque operations.
23 > * <tt>poll</tt>, along with other stack and deque operations.<p>
24   *
25   * All of the operations perform as could be expected for a doubly-linked
26   * list.  Operations that index into the list will traverse the list from
27   * the beginning or the end, whichever is closer to the specified index.<p>
28   *
29 < * <b>Note that this implementation is not synchronized.</b> If multiple
30 < * threads access a list concurrently, and at least one of the threads
31 < * modifies the list structurally, it <i>must</i> be synchronized
32 < * externally.  (A structural modification is any operation that adds or
33 < * deletes one or more elements; merely setting the value of an element is not
34 < * a structural modification.)  This is typically accomplished by
35 < * synchronizing on some object that naturally encapsulates the list.  If no
36 < * such object exists, the list should be "wrapped" using the
35 < * Collections.synchronizedList method.  This is best done at creation time,
36 < * to prevent accidental unsynchronized access to the list: <pre>
37 < *     List list = Collections.synchronizedList(new LinkedList(...));
38 < * </pre><p>
29 > * <p><strong>Note that this implementation is not synchronized.</strong>
30 > * If multiple threads access a linked list concurrently, and at least
31 > * one of the threads modifies the list structurally, it <i>must</i> be
32 > * synchronized externally.  (A structural modification is any operation
33 > * that adds or deletes one or more elements; merely setting the value of
34 > * an element is not a structural modification.)  This is typically
35 > * accomplished by synchronizing on some object that naturally
36 > * encapsulates the list.
37   *
38 < * The iterators returned by the this class's <tt>iterator</tt> and
38 > * If no such object exists, the list should be "wrapped" using the
39 > * {@link Collections#synchronizedList Collections.synchronizedList}
40 > * method.  This is best done at creation time, to prevent accidental
41 > * unsynchronized access to the list:<pre>
42 > *   List list = Collections.synchronizedList(new LinkedList(...));</pre>
43 > *
44 > * <p>The iterators returned by this class's <tt>iterator</tt> and
45   * <tt>listIterator</tt> methods are <i>fail-fast</i>: if the list is
46 < * structurally modified at any time after the iterator is created, in any way
47 < * except through the Iterator's own <tt>remove</tt> or <tt>add</tt> methods,
48 < * the iterator will throw a <tt>ConcurrentModificationException</tt>.  Thus,
49 < * in the face of concurrent modification, the iterator fails quickly and
50 < * cleanly, rather than risking arbitrary, non-deterministic behavior at an
51 < * undetermined time in the future.
46 > * structurally modified at any time after the iterator is created, in
47 > * any way except through the Iterator's own <tt>remove</tt> or
48 > * <tt>add</tt> methods, the iterator will throw a {@link
49 > * ConcurrentModificationException}.  Thus, in the face of concurrent
50 > * modification, the iterator fails quickly and cleanly, rather than
51 > * risking arbitrary, non-deterministic behavior at an undetermined
52 > * time in the future.
53   *
54   * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
55   * as it is, generally speaking, impossible to make any hard guarantees in the
# Line 52 | Line 57 | package java.util;
57   * throw <tt>ConcurrentModificationException</tt> on a best-effort basis.
58   * Therefore, it would be wrong to write a program that depended on this
59   * exception for its correctness:   <i>the fail-fast behavior of iterators
60 < * should be used only to detect bugs.</i><p>
60 > * should be used only to detect bugs.</i>
61   *
62 < * This class is a member of the
62 > * <p>This class is a member of the
63   * <a href="{@docRoot}/../guide/collections/index.html">
64   * Java Collections Framework</a>.
65   *
# Line 63 | Line 68 | package java.util;
68   * @see     List
69   * @see     ArrayList
70   * @see     Vector
66 * @see     Collections#synchronizedList(List)
71   * @since 1.2
72   * @param <E> the type of elements held in this collection
73   */
# Line 87 | Line 91 | public class LinkedList<E>
91       * collection, in the order they are returned by the collection's
92       * iterator.
93       *
94 <     * @param  c the collection whose elements are to be placed into this list.
95 <     * @throws NullPointerException if the specified collection is null.
94 >     * @param  c the collection whose elements are to be placed into this list
95 >     * @throws NullPointerException if the specified collection is null
96       */
97 <     public LinkedList(Collection<? extends E> c) {
98 <         this();
99 <         addAll(c);
100 <     }
97 >    public LinkedList(Collection<? extends E> c) {
98 >        this();
99 >        addAll(c);
100 >    }
101  
102      /**
103       * Returns the first element in this list.
104       *
105 <     * @return the first element in this list.
106 <     * @throws    NoSuchElementException if this list is empty.
105 >     * @return the first element in this list
106 >     * @throws NoSuchElementException if this list is empty
107       */
108      public E getFirst() {
109          if (size==0)
# Line 111 | Line 115 | public class LinkedList<E>
115      /**
116       * Returns the last element in this list.
117       *
118 <     * @return the last element in this list.
119 <     * @throws    NoSuchElementException if this list is empty.
118 >     * @return the last element in this list
119 >     * @throws NoSuchElementException if this list is empty
120       */
121      public E getLast()  {
122          if (size==0)
# Line 124 | Line 128 | public class LinkedList<E>
128      /**
129       * Removes and returns the first element from this list.
130       *
131 <     * @return the first element from this list.
132 <     * @throws    NoSuchElementException if this list is empty.
131 >     * @return the first element from this list
132 >     * @throws NoSuchElementException if this list is empty
133       */
134      public E removeFirst() {
135          return remove(header.next);
# Line 134 | Line 138 | public class LinkedList<E>
138      /**
139       * Removes and returns the last element from this list.
140       *
141 <     * @return the last element from this list.
142 <     * @throws    NoSuchElementException if this list is empty.
141 >     * @return the last element from this list
142 >     * @throws NoSuchElementException if this list is empty
143       */
144      public E removeLast() {
145          return remove(header.previous);
146      }
147  
148      /**
149 <     * Inserts the given element at the beginning of this list.
149 >     * Inserts the specified element at the beginning of this list.
150       *
151 <     * @param o the element to be inserted at the beginning of this list.
151 >     * @param e the element to add
152       */
153 <    public void addFirst(E o) {
154 <        addBefore(o, header.next);
153 >    public void addFirst(E e) {
154 >        addBefore(e, header.next);
155      }
156  
157      /**
158 <     * Appends the given element to the end of this list.  (Identical in
159 <     * function to the <tt>add</tt> method; included only for consistency.)
158 >     * Appends the specified element to the end of this list.
159 >     *
160 >     * <p>This method is equivalent to {@link #add}.
161       *
162 <     * @param o the element to be inserted at the end of this list.
162 >     * @param e the element to add
163       */
164 <    public void addLast(E o) {
165 <        addBefore(o, header);
164 >    public void addLast(E e) {
165 >        addBefore(e, header);
166      }
167  
168      /**
169       * Returns <tt>true</tt> if this list contains the specified element.
170       * More formally, returns <tt>true</tt> if and only if this list contains
171 <     * at least one element <tt>e</tt> such that <tt>(o==null ? e==null
172 <     * : o.equals(e))</tt>.
171 >     * at least one element <tt>e</tt> such that
172 >     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
173       *
174 <     * @param o element whose presence in this list is to be tested.
175 <     * @return <tt>true</tt> if this list contains the specified element.
174 >     * @param o element whose presence in this list is to be tested
175 >     * @return <tt>true</tt> if this list contains the specified element
176       */
177      public boolean contains(Object o) {
178          return indexOf(o) != -1;
# Line 176 | Line 181 | public class LinkedList<E>
181      /**
182       * Returns the number of elements in this list.
183       *
184 <     * @return the number of elements in this list.
184 >     * @return the number of elements in this list
185       */
186      public int size() {
187          return size;
# Line 185 | Line 190 | public class LinkedList<E>
190      /**
191       * Appends the specified element to the end of this list.
192       *
193 <     * @param o element to be appended to this list.
194 <     * @return <tt>true</tt> (as per the general contract of
195 <     * <tt>Collection.add</tt>).
193 >     * <p>This method is equivalent to {@link #addLast}.
194 >     *
195 >     * @param e element to be appended to this list
196 >     * @return <tt>true</tt> (as specified by {@link Collection#add})
197       */
198 <    public boolean add(E o) {
199 <        addBefore(o, header);
198 >    public boolean add(E e) {
199 >        addBefore(e, header);
200          return true;
201      }
202  
203      /**
204 <     * Removes the first occurrence of the specified element in this list.  If
205 <     * the list does not contain the element, it is unchanged.  More formally,
206 <     * removes the element with the lowest index <tt>i</tt> such that
207 <     * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt> (if such an
208 <     * element exists).
204 >     * Removes the first occurrence of the specified element from this list,
205 >     * if it is present.  If this list does not contain the element, it is
206 >     * unchanged.  More formally, removes the element with the lowest index
207 >     * <tt>i</tt> such that
208 >     * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>
209 >     * (if such an element exists).  Returns <tt>true</tt> if this list
210 >     * contained the specified element (or equivalently, if this list
211 >     * changed as a result of the call).
212       *
213 <     * @param o element to be removed from this list, if present.
214 <     * @return <tt>true</tt> if the list contained the specified element.
213 >     * @param o element to be removed from this list, if present
214 >     * @return <tt>true</tt> if this list contained the specified element
215       */
216      public boolean remove(Object o) {
217          if (o==null) {
# Line 228 | Line 237 | public class LinkedList<E>
237       * this list, in the order that they are returned by the specified
238       * collection's iterator.  The behavior of this operation is undefined if
239       * the specified collection is modified while the operation is in
240 <     * progress.  (This implies that the behavior of this call is undefined if
241 <     * the specified Collection is this list, and this list is nonempty.)
240 >     * progress.  (Note that this will occur if the specified collection is
241 >     * this list, and it's nonempty.)
242       *
243 <     * @param c the elements to be inserted into this list.
244 <     * @return <tt>true</tt> if this list changed as a result of the call.
245 <     * @throws NullPointerException if the specified collection is null.
243 >     * @param c collection containing elements to be added to this list
244 >     * @return <tt>true</tt> if this list changed as a result of the call
245 >     * @throws NullPointerException if the specified collection is null
246       */
247      public boolean addAll(Collection<? extends E> c) {
248          return addAll(size, c);
# Line 247 | Line 256 | public class LinkedList<E>
256       * in the list in the order that they are returned by the
257       * specified collection's iterator.
258       *
259 <     * @param index index at which to insert first element
260 <     *              from the specified collection.
261 <     * @param c elements to be inserted into this list.
262 <     * @return <tt>true</tt> if this list changed as a result of the call.
263 <     * @throws IndexOutOfBoundsException if the specified index is out of
264 <     *            range (<tt>index &lt; 0 || index &gt; size()</tt>).
256 <     * @throws NullPointerException if the specified collection is null.
259 >     * @param index index at which to insert the first element
260 >     *              from the specified collection
261 >     * @param c collection containing elements to be added to this list
262 >     * @return <tt>true</tt> if this list changed as a result of the call
263 >     * @throws IndexOutOfBoundsException {@inheritDoc}
264 >     * @throws NullPointerException if the specified collection is null
265       */
266      public boolean addAll(int index, Collection<? extends E> c) {
267          if (index < 0 || index > size)
# Line 300 | Line 308 | public class LinkedList<E>
308      /**
309       * Returns the element at the specified position in this list.
310       *
311 <     * @param index index of element to return.
312 <     * @return the element at the specified position in this list.
313 <     *
306 <     * @throws IndexOutOfBoundsException if the specified index is out of
307 <     * range (<tt>index &lt; 0 || index &gt;= size()</tt>).
311 >     * @param index index of the element to return
312 >     * @return the element at the specified position in this list
313 >     * @throws IndexOutOfBoundsException {@inheritDoc}
314       */
315      public E get(int index) {
316          return entry(index).element;
# Line 314 | Line 320 | public class LinkedList<E>
320       * Replaces the element at the specified position in this list with the
321       * specified element.
322       *
323 <     * @param index index of element to replace.
324 <     * @param element element to be stored at the specified position.
325 <     * @return the element previously at the specified position.
326 <     * @throws IndexOutOfBoundsException if the specified index is out of
321 <     *            range (<tt>index &lt; 0 || index &gt;= size()</tt>).
323 >     * @param index index of the element to replace
324 >     * @param element element to be stored at the specified position
325 >     * @return the element previously at the specified position
326 >     * @throws IndexOutOfBoundsException {@inheritDoc}
327       */
328      public E set(int index, E element) {
329          Entry<E> e = entry(index);
# Line 332 | Line 337 | public class LinkedList<E>
337       * Shifts the element currently at that position (if any) and any
338       * subsequent elements to the right (adds one to their indices).
339       *
340 <     * @param index index at which the specified element is to be inserted.
341 <     * @param element element to be inserted.
342 <     *
338 <     * @throws IndexOutOfBoundsException if the specified index is out of
339 <     *            range (<tt>index &lt; 0 || index &gt; size()</tt>).
340 >     * @param index index at which the specified element is to be inserted
341 >     * @param element element to be inserted
342 >     * @throws IndexOutOfBoundsException {@inheritDoc}
343       */
344      public void add(int index, E element) {
345          addBefore(element, (index==size ? header : entry(index)));
# Line 347 | Line 350 | public class LinkedList<E>
350       * subsequent elements to the left (subtracts one from their indices).
351       * Returns the element that was removed from the list.
352       *
353 <     * @param index the index of the element to removed.
354 <     * @return the element previously at the specified position.
355 <     *
353 <     * @throws IndexOutOfBoundsException if the specified index is out of
354 <     *            range (<tt>index &lt; 0 || index &gt;= size()</tt>).
353 >     * @param index the index of the element to be removed
354 >     * @return the element previously at the specified position
355 >     * @throws IndexOutOfBoundsException {@inheritDoc}
356       */
357      public E remove(int index) {
358          return remove(entry(index));
359      }
360  
361      /**
362 <     * Return the indexed entry.
362 >     * Returns the indexed entry.
363       */
364      private Entry<E> entry(int index) {
365          if (index < 0 || index >= size)
# Line 379 | Line 380 | public class LinkedList<E>
380      // Search Operations
381  
382      /**
383 <     * Returns the index in this list of the first occurrence of the
384 <     * specified element, or -1 if the List does not contain this
385 <     * element.  More formally, returns the lowest index i such that
386 <     * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>, or -1 if
387 <     * there is no such index.
388 <     *
389 <     * @param o element to search for.
390 <     * @return the index in this list of the first occurrence of the
391 <     *         specified element, or -1 if the list does not contain this
391 <     *         element.
383 >     * Returns the index of the first occurrence of the specified element
384 >     * in this list, or -1 if this list does not contain the element.
385 >     * More formally, returns the lowest index <tt>i</tt> such that
386 >     * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
387 >     * or -1 if there is no such index.
388 >     *
389 >     * @param o element to search for
390 >     * @return the index of the first occurrence of the specified element in
391 >     *         this list, or -1 if this list does not contain the element
392       */
393      public int indexOf(Object o) {
394          int index = 0;
# Line 409 | Line 409 | public class LinkedList<E>
409      }
410  
411      /**
412 <     * Returns the index in this list of the last occurrence of the
413 <     * specified element, or -1 if the list does not contain this
414 <     * element.  More formally, returns the highest index i such that
415 <     * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>, or -1 if
416 <     * there is no such index.
417 <     *
418 <     * @param o element to search for.
419 <     * @return the index in this list of the last occurrence of the
420 <     *         specified element, or -1 if the list does not contain this
421 <     *         element.
412 >     * Returns the index of the last occurrence of the specified element
413 >     * in this list, or -1 if this list does not contain the element.
414 >     * More formally, returns the highest index <tt>i</tt> such that
415 >     * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
416 >     * or -1 if there is no such index.
417 >     *
418 >     * @param o element to search for
419 >     * @return the index of the last occurrence of the specified element in
420 >     *         this list, or -1 if this list does not contain the element
421       */
422      public int lastIndexOf(Object o) {
423          int index = size;
# Line 442 | Line 441 | public class LinkedList<E>
441  
442      /**
443       * Retrieves, but does not remove, the head (first element) of this list.
444 <     * @return the head of this queue, or <tt>null</tt> if this queue is empty.
444 >     * @return the head of this list, or <tt>null</tt> if this list is empty
445       * @since 1.5
446       */
447      public E peek() {
# Line 453 | Line 452 | public class LinkedList<E>
452  
453      /**
454       * Retrieves, but does not remove, the head (first element) of this list.
455 <     * @return the head of this queue.
456 <     * @throws NoSuchElementException if this queue is empty.
455 >     * @return the head of this list
456 >     * @throws NoSuchElementException if this list is empty
457       * @since 1.5
458       */
459      public E element() {
# Line 462 | Line 461 | public class LinkedList<E>
461      }
462  
463      /**
464 <     * Retrieves and removes the head (first element) of this list.
465 <     * @return the head of this queue, or <tt>null</tt> if this queue is empty.
464 >     * Retrieves and removes the head (first element) of this list
465 >     * @return the head of this list, or <tt>null</tt> if this list is empty
466       * @since 1.5
467       */
468      public E poll() {
# Line 474 | Line 473 | public class LinkedList<E>
473  
474      /**
475       * Retrieves and removes the head (first element) of this list.
476 <     * @return the head of this queue.
477 <     * @throws NoSuchElementException if this queue is empty.
476 >     *
477 >     * @return the head of this list
478 >     * @throws NoSuchElementException if this list is empty
479       * @since 1.5
480       */
481      public E remove() {
# Line 485 | Line 485 | public class LinkedList<E>
485      /**
486       * Adds the specified element as the tail (last element) of this list.
487       *
488 <     * @param o the element to add.
489 <     * @return <tt>true</tt> (as per the general contract of
490 <     * <tt>Queue.offer</tt>)
488 >     * @param e the element to add
489 >     * @return <tt>true</tt> (as specified by {@link Queue#offer})
490       * @since 1.5
491       */
492 <    public boolean offer(E o) {
493 <        return add(o);
492 >    public boolean offer(E e) {
493 >        return add(e);
494      }
495  
496      // Deque operations
497      /**
498 <     * Inserts the specified element to the front this deque.
498 >     * Inserts the specified element at the front of this list.
499       *
500       * @param e the element to insert
501 <     * @return <tt>true</tt> (as per the spec for {@link Deque#offerFirst})
501 >     * @return <tt>true</tt> (as specified by {@link Deque#offerFirst})
502       * @since 1.6
503       */
504      public boolean offerFirst(E e) {
# Line 508 | Line 507 | public class LinkedList<E>
507      }
508  
509      /**
510 <     * Inserts the specified element to the end this deque.
510 >     * Inserts the specified element at the end of this list.
511       *
512       * @param e the element to insert
513 <     * @return <tt>true</tt> (as per the spec for {@link Deque#offerLast})
513 >     * @return <tt>true</tt> (as specified by {@link Deque#offerLast})
514       * @since 1.6
515       */
516      public boolean offerLast(E e) {
# Line 520 | Line 519 | public class LinkedList<E>
519      }
520  
521      /**
522 <     * Retrieves, but does not remove, the first element of this deque,
523 <     * returning <tt>null</tt> if this deque is empty.
522 >     * Retrieves, but does not remove, the first element of this list,
523 >     * or returns <tt>null</tt> if this list is empty.
524       *
525 <     * @return the first element of this deque, or <tt>null</tt> if
526 <     *     this deque is empty
525 >     * @return the first element of this list, or <tt>null</tt>
526 >     *         if this list is empty
527       * @since 1.6
528       */
529      public E peekFirst() {
# Line 534 | Line 533 | public class LinkedList<E>
533      }
534  
535      /**
536 <     * Retrieves, but does not remove, the last element of this deque,
537 <     * returning <tt>null</tt> if this deque is empty.
536 >     * Retrieves, but does not remove, the last element of this list,
537 >     * or returns <tt>null</tt> if this list is empty.
538       *
539 <     * @return the last element of this deque, or <tt>null</tt> if this deque
540 <     *     is empty
539 >     * @return the last element of this list, or <tt>null</tt>
540 >     *         if this list is empty
541       * @since 1.6
542       */
543      public E peekLast() {
# Line 548 | Line 547 | public class LinkedList<E>
547      }
548  
549      /**
550 <     * Retrieves and removes the first element of this deque, or
551 <     * <tt>null</tt> if this deque is empty.
550 >     * Retrieves and removes the first element of this list,
551 >     * or returns <tt>null</tt> if this list is empty.
552       *
553 <     * @return the first element of this deque, or <tt>null</tt> if
554 <     *     this deque is empty
553 >     * @return the first element of this list, or <tt>null</tt> if
554 >     *     this list is empty
555       * @since 1.6
556       */
557      public E pollFirst() {
# Line 562 | Line 561 | public class LinkedList<E>
561      }
562  
563      /**
564 <     * Retrieves and removes the last element of this deque, or
565 <     * <tt>null</tt> if this deque is empty.
564 >     * Retrieves and removes the last element of this list,
565 >     * or returns <tt>null</tt> if this list is empty.
566       *
567 <     * @return the last element of this deque, or <tt>null</tt> if
568 <     *     this deque is empty
567 >     * @return the last element of this list, or <tt>null</tt> if
568 >     *     this list is empty
569       * @since 1.6
570       */
571      public E pollLast() {
# Line 576 | Line 575 | public class LinkedList<E>
575      }
576  
577      /**
578 <     * Pushes an element onto the stack represented by this deque.  In other
579 <     * words, inserts the element to the front this deque.
578 >     * Pushes an element onto the stack represented by this list.  In other
579 >     * words, inserts the element at the front of this list.
580       *
581       * <p>This method is equivalent to {@link #addFirst}.
582       *
# Line 589 | Line 588 | public class LinkedList<E>
588      }
589  
590      /**
591 <     * Pops an element from the stack represented by this deque.  In other
592 <     * words, removes and returns the the first element of this deque.
591 >     * Pops an element from the stack represented by this list.  In other
592 >     * words, removes and returns the first element of this list.
593       *
594       * <p>This method is equivalent to {@link #removeFirst()}.
595       *
596 <     * @return the element at the front of this deque (which is the top
597 <     *     of the stack represented by this deque)
598 <     * @throws NoSuchElementException if this deque is empty
596 >     * @return the element at the front of this list (which is the top
597 >     *         of the stack represented by this list)
598 >     * @throws NoSuchElementException if this list is empty
599       * @since 1.6
600       */
601      public E pop() {
# Line 605 | Line 604 | public class LinkedList<E>
604  
605      /**
606       * Removes the first occurrence of the specified element in this
607 <     * deque (when traversing the deque from head to tail).  If the deque
607 >     * list (when traversing the list from head to tail).  If the list
608       * does not contain the element, it is unchanged.
609       *
610 <     * @param e element to be removed from this deque, if present
611 <     * @return <tt>true</tt> if the deque contained the specified element
610 >     * @param o element to be removed from this list, if present
611 >     * @return <tt>true</tt> if the list contained the specified element
612       * @since 1.6
613       */
614 <    public boolean removeFirstOccurrence(Object e) {
615 <        return remove(e);
614 >    public boolean removeFirstOccurrence(Object o) {
615 >        return remove(o);
616      }
617  
618      /**
619       * Removes the last occurrence of the specified element in this
620 <     * deque (when traversing the deque from head to tail).  If the deque
620 >     * list (when traversing the list from head to tail).  If the list
621       * does not contain the element, it is unchanged.
622       *
623 <     * @param o element to be removed from this deque, if present
624 <     * @return <tt>true</tt> if the deque contained the specified element
623 >     * @param o element to be removed from this list, if present
624 >     * @return <tt>true</tt> if the list contained the specified element
625       * @since 1.6
626       */
627      public boolean removeLastOccurrence(Object o) {
628          if (o==null) {
629 <            for (Entry e = header.previous; e != header; e = e.previous) {
629 >            for (Entry<E> e = header.previous; e != header; e = e.previous) {
630                  if (e.element==null) {
631                      remove(e);
632                      return true;
633                  }
634              }
635          } else {
636 <            for (Entry e = header.previous; e != header; e = e.previous) {
636 >            for (Entry<E> e = header.previous; e != header; e = e.previous) {
637                  if (o.equals(e.element)) {
638                      remove(e);
639                      return true;
# Line 658 | Line 657 | public class LinkedList<E>
657       * than risking arbitrary, non-deterministic behavior at an undetermined
658       * time in the future.
659       *
660 <     * @param index index of first element to be returned from the
661 <     *              list-iterator (by a call to <tt>next</tt>).
660 >     * @param index index of the first element to be returned from the
661 >     *              list-iterator (by a call to <tt>next</tt>)
662       * @return a ListIterator of the elements in this list (in proper
663 <     *         sequence), starting at the specified position in the list.
664 <     * @throws    IndexOutOfBoundsException if index is out of range
666 <     *            (<tt>index &lt; 0 || index &gt; size()</tt>).
663 >     *         sequence), starting at the specified position in the list
664 >     * @throws IndexOutOfBoundsException {@inheritDoc}
665       * @see List#listIterator(int)
666       */
667      public ListIterator<E> listIterator(int index) {
# Line 744 | Line 742 | public class LinkedList<E>
742              expectedModCount++;
743          }
744  
745 <        public void set(E o) {
745 >        public void set(E e) {
746              if (lastReturned == header)
747                  throw new IllegalStateException();
748              checkForComodification();
749 <            lastReturned.element = o;
749 >            lastReturned.element = e;
750          }
751  
752 <        public void add(E o) {
752 >        public void add(E e) {
753              checkForComodification();
754              lastReturned = header;
755 <            addBefore(o, next);
755 >            addBefore(e, next);
756              nextIndex++;
757              expectedModCount++;
758          }
# Line 777 | Line 775 | public class LinkedList<E>
775          }
776      }
777  
778 <    private Entry<E> addBefore(E o, Entry<E> e) {
779 <        Entry<E> newEntry = new Entry<E>(o, e, e.previous);
778 >    private Entry<E> addBefore(E e, Entry<E> entry) {
779 >        Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
780          newEntry.previous.next = newEntry;
781          newEntry.next.previous = newEntry;
782          size++;
# Line 801 | Line 799 | public class LinkedList<E>
799      }
800  
801      /**
802 +     * @since 1.6
803 +     */
804 +    public Iterator<E> descendingIterator() {
805 +        return new DescendingIterator();
806 +    }
807 +
808 +    /** Adapter to provide descending iterators via ListItr.previous */
809 +    private class DescendingIterator implements Iterator {
810 +        final ListItr itr = new ListItr(size());
811 +        public boolean hasNext() {
812 +            return itr.hasPrevious();
813 +        }
814 +        public E next() {
815 +            return itr.previous();
816 +        }
817 +        public void remove() {
818 +            itr.remove();
819 +        }
820 +    }
821 +
822 +    /**
823       * Returns a shallow copy of this <tt>LinkedList</tt>. (The elements
824       * themselves are not cloned.)
825       *
826 <     * @return a shallow copy of this <tt>LinkedList</tt> instance.
826 >     * @return a shallow copy of this <tt>LinkedList</tt> instance
827       */
828      public Object clone() {
829          LinkedList<E> clone = null;
# Line 829 | Line 848 | public class LinkedList<E>
848  
849      /**
850       * Returns an array containing all of the elements in this list
851 <     * in the correct order.
851 >     * in proper sequence (from first to last element).
852 >     *
853 >     * <p>The returned array will be "safe" in that no references to it are
854 >     * maintained by this list.  (In other words, this method must allocate
855 >     * a new array).  The caller is thus free to modify the returned array.
856 >     *
857 >     * <p>This method acts as bridge between array-based and collection-based
858 >     * APIs.
859       *
860       * @return an array containing all of the elements in this list
861 <     *         in the correct order.
861 >     *         in proper sequence
862       */
863      public Object[] toArray() {
864          Object[] result = new Object[size];
# Line 844 | Line 870 | public class LinkedList<E>
870  
871      /**
872       * Returns an array containing all of the elements in this list in
873 <     * the correct order; the runtime type of the returned array is that of
874 <     * the specified array.  If the list fits in the specified array, it
875 <     * is returned therein.  Otherwise, a new array is allocated with the
876 <     * runtime type of the specified array and the size of this list.<p>
877 <     *
878 <     * If the list fits in the specified array with room to spare
879 <     * (i.e., the array has more elements than the list),
880 <     * the element in the array immediately following the end of the
881 <     * collection is set to null.  This is useful in determining the length
882 <     * of the list <i>only</i> if the caller knows that the list
883 <     * does not contain any null elements.
873 >     * proper sequence (from first to last element); the runtime type of
874 >     * the returned array is that of the specified array.  If the list fits
875 >     * in the specified array, it is returned therein.  Otherwise, a new
876 >     * array is allocated with the runtime type of the specified array and
877 >     * the size of this list.
878 >     *
879 >     * <p>If the list fits in the specified array with room to spare (i.e.,
880 >     * the array has more elements than the list), the element in the array
881 >     * immediately following the end of the list is set to <tt>null</tt>.
882 >     * (This is useful in determining the length of the list <i>only</i> if
883 >     * the caller knows that the list does not contain any null elements.)
884 >     *
885 >     * <p>Like the {@link #toArray()} method, this method acts as bridge between
886 >     * array-based and collection-based APIs.  Further, this method allows
887 >     * precise control over the runtime type of the output array, and may,
888 >     * under certain circumstances, be used to save allocation costs.
889 >     *
890 >     * <p>Suppose <tt>x</tt> is a list known to contain only strings.
891 >     * The following code can be used to dump the list into a newly
892 >     * allocated array of <tt>String</tt>:
893 >     *
894 >     * <pre>
895 >     *     String[] y = x.toArray(new String[0]);</pre>
896 >     *
897 >     * Note that <tt>toArray(new Object[0])</tt> is identical in function to
898 >     * <tt>toArray()</tt>.
899       *
900       * @param a the array into which the elements of the list are to
901 <     *          be stored, if it is big enough; otherwise, a new array of the
902 <     *          same runtime type is allocated for this purpose.
903 <     * @return an array containing the elements of the list.
904 <     * @throws ArrayStoreException if the runtime type of a is not a
905 <     *         supertype of the runtime type of every element in this list.
906 <     * @throws NullPointerException if the specified array is null.
901 >     *          be stored, if it is big enough; otherwise, a new array of the
902 >     *          same runtime type is allocated for this purpose.
903 >     * @return an array containing the elements of the list
904 >     * @throws ArrayStoreException if the runtime type of the specified array
905 >     *         is not a supertype of the runtime type of every element in
906 >     *         this list
907 >     * @throws NullPointerException if the specified array is null
908       */
909      public <T> T[] toArray(T[] a) {
910          if (a.length < size)
# Line 886 | Line 928 | public class LinkedList<E>
928       * is, serialize it).
929       *
930       * @serialData The size of the list (the number of elements it
931 <     *             contains) is emitted (int), followed by all of its
932 <     * elements (each an Object) in the proper order.
931 >     *             contains) is emitted (int), followed by all of its
932 >     *             elements (each an Object) in the proper order.
933       */
934      private void writeObject(java.io.ObjectOutputStream s)
935          throws java.io.IOException {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines