下面是LinkedList实现
package c3; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.function.Consumer; public class MyLinkedList<AnyType > implements Iterable<AnyType> { private static class Node <AnyType>{ public Node<AnyType> pre ; public Node<AnyType> next ; public AnyType data ; public Node(Node<AnyType> pre ,Node<AnyType> next, AnyType data){ this.pre = pre; this.next= next; this.data = data ; } } private int modCount=0; private int theSize ; private Node<AnyType> beginMarker ; //头结点和尾结点不存放数据 private Node<AnyType> endMarker; public MyLinkedList(){ clear() ; } public void clear (){ beginMarker = new Node<AnyType>(null, null, null) ; endMarker = new Node<AnyType>(beginMarker, null, null) ; beginMarker.next = endMarker ; //这里要注意,不能直接在beginMarker中赋值 theSize =0; modCount ++; } public int size(){ return theSize ; } public boolean isEmpty(){ return size()==0; } /** * add to last */ public boolean add(AnyType x ){ add(x, size()) ; return true ; } public void add(AnyType x ,int index){ addBefore(getNode(index), x) ; } public AnyType get(int index ){ return getNode(index).data; } public AnyType set(int index, AnyType newVal){ Node<AnyType> pNode = getNode(index) ; AnyType oldVal = pNode.data ; pNode.data = newVal ; return oldVal; } public AnyType remove (int index ){ return remove(getNode(index)) ; } public Node<AnyType> getNode(int index){ if (index<0|| index>size()){ throw new IndexOutOfBoundsException() ; } Node<AnyType> pNode; if (index< size()/2){ pNode= beginMarker.next; for (int i=0;i<index;i++){ pNode =pNode.next; } }else { pNode= endMarker; //注意上面的是beginMarker.next for (int i=0;i<index ;i++){ pNode = pNode.pre ; } } return pNode ; } /** * 要改三个点 */ public void addBefore(Node<AnyType> p, AnyType x ){ Node<AnyType> newNode = new Node<AnyType>(p.pre, p, x) ; //newNode newNode.pre.next = newNode ; //p前面的点 p.pre = newNode ; //p theSize++ ; modCount++ ; } /** * 要改两个点 */ private AnyType remove(Node<AnyType> p){ p.pre.next = p.next ; p.next.pre = p.pre ; theSize --; modCount++; return p.data ; } public Iterator<AnyType> iterator() { return new MyLinkedListIterator(); } private class MyLinkedListIterator implements Iterator<AnyType>{ private Node<AnyType> currentNode = beginMarker.next ; //第一个开始 ,类似于MyArrayList,第一次调用 next时,应该返回current中的数据 private int expectedModCount = modCount ; private boolean okToRemove = false ; public boolean hasNext() { return currentNode!= endMarker ; } /** * 在调用了next后,才可以进行remove,所以remove的是current前面的数据 */ public AnyType next() { if (modCount!= expectedModCount){ throw new ConcurrentModificationException() ; } if (!hasNext()){ throw new NoSuchElementException(); } AnyType nextItem = currentNode.data ; currentNode = currentNode.next ; //后移动一个 okToRemove = true ; return nextItem; } public void remove() { if (modCount!= expectedModCount){ throw new ConcurrentModificationException(); } if (!okToRemove){ throw new IllegalStateException() ; } MyLinkedList.this.remove(currentNode.pre) ; okToRemove = false ; expectedModCount ++ ; } } }