import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.NoSuchElementException; public class MyLinkedList<T> implements Iterable<T> { //头结点 Node<T> beginMarker; //尾节点 Node<T> endMarker; //链表长度 private int theSize; //链表修改次数 private int modCount; //定义节点类 private class Node<T>{ T val; Node pre; Node next; public Node(T val,Node<T> pre,Node<T> next){ this.val=val; this.pre=pre; this.next=next; } } public MyLinkedList(){ doClear(); } public void Clear(){ doClear(); } private void doClear() { // TODO Auto-generated method stub beginMarker = new Node<T>(null, null, null); endMarker=new Node<T>(null, beginMarker, null); beginMarker.next=endMarker; theSize=0; modCount++; } public int size(){ return theSize; } public boolean isEmpty(){ return size()==0; } public boolean add(T val){ add(size(),val); return true; } public void add(int index, T val) { // TODO Auto-generated method stub addBefore(getNode(index,0,size()),val); } public T get(int index){ return getNode(index).val; } public T set(int index,T newval){ Node<T> node=getNode(index); T oldval=node.val; node.val=newval; return oldval; } public T remove(int index){ return remove(getNode(index)); } private T remove(Node<T> node) { node.next.pre=node.pre; node.pre.next=node.next; theSize--; modCount++; return node.val; } private Node<T> getNode(int index) { // TODO Auto-generated method stub return getNode(index,0,size()-1); } private void addBefore(Node<T> node, T val) { // TODO Auto-generated method stub Node<T> newnode=new Node<T>(val, node.pre, node); newnode.pre.next=newnode; node.pre=newnode; theSize++; modCount++; } private Node<T> getNode(int index, int begin, int end) { Node<T> p=null; if(index<begin&&index>end){ throw new IndexOutOfBoundsException(); } if(index<size()/2){ p=beginMarker.next; for(int i=0;i<index;i++){ p=p.next; } }else{ p=endMarker; for(int j=size();j>index;j--){ p=p.pre; } } return null; } public Iterator<T> iterator() { // TODO Auto-generated method stub return new LinkedListIterator(); } private class LinkedListIterator implements Iterator<T>{ private Node<T> current=beginMarker.next; private int expecteModeCount=modCount; private boolean okToRemove=false; public boolean hasNext() { // TODO Auto-generated method stub return beginMarker!=endMarker; } public T next() { // TODO Auto-generated method stub if(modCount!=expecteModeCount){ throw new ConcurrentModificationException(); } if(!hasNext()){ throw new NoSuchElementException(); } T nextItem=current.val; current=current.next; okToRemove=true; return nextItem; } public void remove() { // TODO Auto-generated method stub if(modCount!=expecteModeCount){ throw new ConcurrentModificationException(); } if(!hasNext()){ throw new IllegalStateException(); } MyLinkedList.this.remove(current.pre); expecteModeCount++; okToRemove=false; } } }