package banshee; import java.util.NoSuchElementException; public class LinkedList { private Node head; private Node last; private int size = 0; public void add(Object o){ addAtLast(o); } public void add(int index , Object o){ rangeCheck(index); if (index == size) { addAtLast(o); }else{ linkBrfore(o, node(index)); } } public Object get(int index){ rangeCheck(index); return node(index); } public Object remove(int index){ Node e = node(index); remove(e); return null; } public int size(){ return size; } public void addFirst(Object o){ final Node h = head ; final Node newNode = new Node(null, o, h); if (h == null) { last = newNode; }else{ h.prev = newNode; } size++; } public void addLast(Object o){ addAtLast(o); } public Object removeFirst(){ final Node h = head; final Object e = h.data; Node next = h.next; h.data = null; h.next = null; head = next; if (next == null) last = null; else next.prev = null; size--; return e; } public Object removeLast(){ final Node l = last; final Object e = l.data; Node newL = l.prev; l.data = null; l.prev = null; last = newL; if (newL == null) head = null; else newL.next = null; size--; return e; } // public Iterator iterator(){ // //TODO // //����... // return null; // } private static class Node{ Object data; Node next; Node prev; Node(Node prev, Object element,Node next){ this.data = element ; this.next = next; this.prev = prev ; } } private void addAtLast(Object element){ Node l = last; Node newLink = new Node(l, element, null); last = newLink; if (l == null) { head = newLink; }else { l.next = newLink; } size++; } private void linkBrfore(Object element , Node spNode ){ final Node pred = spNode.prev; final Node newNode = new Node(pred, element, spNode); spNode.prev = newNode; if (pred == null) { head = newNode; }else{ pred.next = newNode; } size++; } private void rangeCheck(int index) { if (index > size || index < 0) { throw new IndexOutOfBoundsException("ָ����index��������"); } } private Node node(int index) { if (index < (size >> 1)) { Node x = head; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } } private Object remove(Node e) { if (e == head ) throw new NoSuchElementException(); Object result = e. data; e. prev.next = e.next; e. next.prev = e.prev; e. next = e.prev = null; e. data = null; size--; return result; } }