package week1.collection; /** * Created by zndbl on 2017/3/11. */ public class MyLinkedList { private int size; private Node first; private Node last; public static class Node{ Object item; Node next; Node prev; public Node(Object item, Node next, Node prev) { this.item = item; this.next = next; this.prev = prev; } } public boolean add(Object element) { addAtLast(element); return true; } public void addAtLast(Object element) { Node l = last; Node node = new Node(element,null,l); last = node; if(l == null) { first = node; } else { l.next = node; } size++; } public Node node(int index) { if(index < size/2 ) { Node cussor = first; for (int i = 0; i < index ; i++) { cussor = cussor.next; } return cussor; } else { Node cussor = last; for (int i = size -1 ; i > index ; i--) { cussor = cussor.prev; } return cussor; } } public Object get(int index) { checkRange(index); return node(index).item; } public void checkRange(int index) { if(index >= size || index < 0) { throw new RuntimeException("index超过界限"); } } public int indexOf(Object element) { Node cussor = first; int count = 0; while (cussor != null) { if(element.equals(cussor.item)) { return count; } count++; cussor = cussor.next; } return -1; } public boolean remove(Object o) { int index = indexOf(o); if(index < 0) { return false; } deleteLink(index); return true; } public Object deleteLink(int index) { Node l = node(index); Object item = l.item; Node prevNode = l.prev; Node nextNode = l.next; if(prevNode == null) { first = nextNode; } else { prevNode.next = nextNode; l.next = null; } if(nextNode == null) { last = prevNode; } else { nextNode.prev = prevNode; l.prev = null; } size--; l.item = null; return item; } }