package com.coding.basic; public class LinkedList implements List { //链表的长度 int size = 0; private Node first; private Node last; public void add(Object o){ linkLast(o); size++; } /** * 按照索引添加 * @param index * @param o */ public void add(int index , Object o){ if (index == size) linkLast(o); else linkBefore(o, node(index)); } /** * 向链表的最后添加元素 * @param o */ private void linkLast(Object o) { final Node l = last; final Node newNode = new Node(o, l, null); last = newNode; if (l == null) //如果只有一个元素, 那么设置链表的first为newNode first = newNode; else l.next = newNode; size++; } /** * 向链表指定位置添加元素 * @param o * @param node */ private void linkBefore(Object o, Node node) { final Node pred = node.prev; final Node newNode = new Node(o, pred, node); node.prev = newNode; if (pred == null) first = newNode; else pred.next = newNode; size++; } /** * 将元素添加到起始位置。 * @param o */ private void linkFirst(Object o) { final Node f = first; final Node newNode = new Node(o, null, f); first = newNode; if (f == null) last = newNode; else f.prev = newNode; size++; } /** * 这里查找index节点时, 通过index与size/2的距离来判断是从前往后找还是从后往前找。 * @param index * @return */ Node node(int index) { if (index < (size >> 1)) { Node x = first; 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; } } /** * 直接调用node方法即可。 * @param index * @return */ public Object get(int index){ return node(index); } /** * 根据下标删除 * @param index * @return */ public Object remove(int index){ Node node = node(index); return remove(node); } /** * 根据节点的data值来remove * @param o * @return */ public Object remove(Object o) { if (o == null) { for (Node x = first; x != null; x = x.next) { if (x.data == null) { return remove(x); } } } else { for (Node x = first; x != null; x = x.next) { if (o.equals(x.data)) { return remove(x); } } } return null; } private Object remove(Node node){ final Object obj = node.data; final Node next = node.next; final Node prev = node.prev; //判断临界的地方,index为第一个元素, index为第二个元素 if (node == first) { first = next; } else if (node == last) { last = prev; } else { prev.next = next; next.prev = prev; node.next = null; node.prev = null; } node.data = null; size--; return obj; } public int size(){ return -size; } public void addFirst(Object o){ linkFirst(o); } public void addLast(Object o){ linkLast(o); } public Object removeFirst(){ return remove(first); } /** * 获取但不删除栈顶元素,失败则抛出异常 * @return */ public Object peekFirst() { final Node f = first; return (f == null) ? null : f.data; } public Object removeLast(){ return remove(last); } public Iterator iterator(){ return null; } /** * Node内部实现类 */ private static class Node{ Object data; Node prev; Node next; /** * 使用内部类来实现链表的每一个节点,每个节点有一个指向下一个元素的next,指向上一个元素的prev,以及自身的data */ public Node(Object data, Node prev, Node next) { this.data = data; this.next = next; this.prev = prev; } } }