#import "ArrayIterator.h" @class LinkedList; /** * LinkedList entry. */ @interface LLNode : NSObject { LLNode *next; LLNode *prev; id item; } @property(retain) LLNode *next; @property(retain) LLNode *prev; @property(retain) id item; + (LLNode *) newNode:(LLNode *)aPrev element:(id)anElement next:(LLNode *)aNext; - (id) init:(LLNode *)aPrev element:(id)anElement next:(LLNode *)aNext; - (void) dealloc; @end @interface ListIterator : ArrayIterator { LLNode * lastReturned; LLNode * next; NSInteger nextIndex; NSInteger expectedModCount; LinkedList *ll; } + (ListIterator *) newIterator:(LinkedList *)anLL; + (ListIterator *) newIterator:(LinkedList *)anLL withIndex:(NSInteger)anIndex; - (id) init:(LinkedList *)anLL withIndex:(NSInteger)anIndex; - (BOOL) hasNext; - (LLNode *) next; - (BOOL) hasPrevious; - (LLNode *) previous; - (NSInteger) nextIndex; - (NSInteger) previousIndex; - (void) remove; - (void) set:(LLNode *)e; - (void) add:(LLNode *)e; - (void) checkForComodification; @end /** * Adapter to provide descending iterators via ListItr.previous */ @interface DescendingIterator : ListIterator { } + (DescendingIterator *) newIterator:(LinkedList *)anLL; - (id) init:(LinkedList *)anLL; - (BOOL) hasNext; - (LLNode *) next; - (void) remove; - (void) dealloc; @end /** * Doubly-linked list implementation of the {@code List} and {@code Deque} * interfaces. Implements all optional list operations, and permits all * elements (including {@code null}). * *
All of the operations perform as could be expected for a doubly-linked * list. Operations that index into the list will traverse the list from * the beginning or the end, whichever is closer to the specified index. * *
Note that this implementation is not synchronized. * If multiple threads access a linked list concurrently, and at least * one of the threads modifies the list structurally, it must be * synchronized externally. (A structural modification is any operation * that adds or deletes one or more elements; merely setting the value of * an element is not a structural modification.) This is typically * accomplished by synchronizing on some object that naturally * encapsulates the list. * * If no such object exists, the list should be "wrapped" using the * {@link Collections#synchronizedList Collections.synchronizedList} * method. This is best done at creation time, to prevent accidental * unsynchronized access to the list:
* List list = Collections.synchronizedList(new LinkedList(...));* *
The iterators returned by this class's {@code iterator} and * {@code listIterator} methods are fail-fast: if the list is * structurally modified at any time after the iterator is created, in * any way except through the Iterator's own {@code remove} or * {@code add} methods, the iterator will throw a {@link * ConcurrentModificationException}. Thus, in the face of concurrent * modification, the iterator fails quickly and cleanly, rather than * risking arbitrary, non-deterministic behavior at an undetermined * time in the future. * *
Note that the fail-fast behavior of an iterator cannot be guaranteed * as it is, generally speaking, impossible to make any hard guarantees in the * presence of unsynchronized concurrent modification. Fail-fast iterators * throw {@code ConcurrentModificationException} on a best-effort basis. * Therefore, it would be wrong to write a program that depended on this * exception for its correctness: the fail-fast behavior of iterators * should be used only to detect bugs. * *
This class is a member of the
*
* Java Collections Framework.
*
* @author Josh Bloch
* @see List
* @see ArrayList
* @since 1.2
* @param