package net.iyouqu.bruceretrofit.util.java; /** * Created by liq on 2017/2/25. */ public class CustomLinkedList<E> implements List { //链表长度 private int size = 0; //链表头指针 private Node<Object> first; //链表尾部指针 private Node<Object> last; //操作次数 private int modCount; @Override public void add(Object o) { linkLast(o); } @Override public void add(int index, Object o) { checkPositionIndex(index); if (index == size) { linkLast(o); } else { linkBefore(o, node(index)); } } @Override public Object get(int index) { checkPositionIndex(index); return node(index).data; } @Override public Object remove(int index) { checkPositionIndex(index); return unlink(node(index)); } @Override public int size() { return size; } /** * 添加节点到链表尾部 */ public void addLast(Object e) { linkLast(e); } /** * 解除传入节点的属性,并且将传入节点的上一个和下一个节点 链接。使传入节点的属性 全部为 null */ private Object unlink(Node<Object> node) { //获取当前节点node的属性 final Object element = node.data; final Node<Object> next = node.next; final Node<Object> prev = node.prev; if (prev == null) { //上一个节点为null将首节点设置为下一个节点 first = next; } else { //上一个节点有 将上一个节点的下一个节点 设置为当前节点的下一个节点 prev.next = next; //将当前节点的上一个节点设置为null node.prev = null; } if (next == null) { //下一个节点为null将末尾节点设置为上一个节点 last = prev; } else { //将下一个节点的上一个节点 设置为当前节点的上一个节点 next.prev = prev; node.next = null; } node.data = null; size--; modCount++; return element; } /** * 获取一个节点 * 判断index 在前半区间还是后半区间。而不是一直从头到尾搜索 * 将节点访问复杂度从O(n)变为O(n/2) */ private Node<Object> node(int index) { checkPositionIndex(index); if (index < (size / 2)) { Node<Object> x = first; for (int i = 0; i < index; i++) { x = x.next; } return x; } else { Node<Object> x = last; for (int i = size - 1; i > index; i--) { x = x.prev; } return x; } } /** * 在参数节点之前插入一个节点 */ private void linkBefore(Object element, Node<Object> node) { //获取添加节点的上一个节点 final Node<Object> pred = node.prev; //创建一个新节点 final Node<Object> newNode = new Node<>(pred, element, node); //添加节点的上一个节点为 新节点 node.prev = newNode; //判断上一个节点是否为null if (pred == null) { //首节点设置为新创建的节点 first = newNode; } else { //上个节点不为null。将其下个节点设置为新创建的节点。 pred.next = newNode; } size++; modCount++; } /** * 链接 节点到 last */ private void linkLast(Object e) { final Node<Object> l = last; final Node<Object> newNode = new Node<>(l, e, null); last = newNode; //判断链表last是否为null if (l == null) { //链表first指向新添加的 节点 first = newNode; } else { //链表last不为null将链表last节点的的next设置为新节点 l.next = newNode; } size++; modCount++; } /** * 检查index是否越界 */ private void checkPositionIndex(int index) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException("index超过界限"); } } private static class Node<E> { Object data; //下一个节点 Node<Object> next; //上一个节点 Node<Object> prev; public Node(Node<Object> prev, Object item, Node<Object> next) { this.data = item; this.next = next; this.prev = prev; } } }