package list; public class LinkedList implements List { public Node getFirst() { return first; } public Node getLast() { return last; } private int size; private Node first; private Node last; @Override public void add(int paramInt, Object paramE) { checkPositionIndex(paramInt); if (paramInt == size) { linkLast(paramE); } else { linkBefore(paramE, node(paramInt)); } } // 寻找到需要插入的那个node Node node(int paramInt) { if (paramInt < size >> 1) { Node x = first; for (int i = 0; i < paramInt; i++) { x = x.next; } return x; } else { Node x = last; for (int i = size - 1; i > paramInt; i--) { x = x.prev; } return x; } } private void linkBefore(Object o, Node node) { Node pred = node.prev; Node newNode = new Node(pred, o, node); node.prev = newNode; if (pred == null) { first = newNode; } else { pred.next = newNode; } } private void checkPositionIndex(int paramInt) { if (paramInt < 0 || paramInt > size) { throw new IndexOutOfBoundsException("Index: " + paramInt + ", Size: " + size); } } @Override public boolean add(Object paramE) { linkLast(paramE); return true; } private void linkLast(Object paramE) { Node l = last; Node newNode = new Node(l, paramE, null); last = newNode; if (l == null) { first = newNode; } else { l.next = newNode; } size++; } @Override public void clear() { for (Node x = first; x != null;) { Node next = x.next; x.next = null; x.prev = null; x.item = null; x = next; } first = last = null; size = 0; } @Override public boolean contains(Object paramObject) { return false; } @Override public Object get(int paramInt) { checkPositionIndex(paramInt); return node(paramInt).item; } @Override public int indexOf(Object paramObject) { return 0; } @Override public boolean isEmpty() { return size == 0 ? true : false; } @Override public Iterator iterator() { return new LinkedIterator(); } @Override public Object remove(int paramInt) { checkPositionIndex(paramInt); return unlink(node(paramInt)); } private Object unlink(Node node) { Object item = node.item; Node prev = node.prev; Node next = node.next; if (prev == null) { first = next; } else { prev.next = next; node.prev = null; } if (next == null) { last = prev; } else { next.prev = prev; node.next = null; } node.item = null; size--; return item; } @Override public boolean remove(Object paramObject) { return false; } @Override public Object set(int paramInt, Object paramE) { return null; } @Override public int size() { return size; } public static class Node { public Object item; public Node next; public Node prev; public Node(Node prev, Object item, Node next) { this.item = item; this.next = next; this.prev = prev; } } private class LinkedIterator implements Iterator { int cursor = 0; int lastRet = -1; @Override public boolean hasNext() { return cursor < size(); } @Override public Object next() { int i = cursor; Object node = get(i); lastRet = i; cursor = i + 1; return node; } @Override public void remove() { if (lastRet < 0) { throw new IllegalStateException(); } LinkedList.this.remove(lastRet); if (lastRet < cursor) { cursor--; } lastRet = -1;// 防止对一个数据多次remove操作 } } }