概述
LinkedList是实现List接口的类,主要有以下特点:
- LinkedList是用双向链表实现的列表。
- LinkedList插入、删除较快,查询较慢。
- LinkedList可以存放包含null对象的任何元素。
- LinkedList是线程不安全的。
LinkedList类图如下:

详解
字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| transient Node<E> first; transient Node<E> last; transient int size = 0;
private static class Node{ E item; Node next; Node prev; Node(Node prev, E element, Node next){ this.item = element; this.next = next; this.prev = prev; } }
|
部分API的实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
private boolean addAll(int index, Collection<? extends E> c){ checkPositionIndex(index); Object[] a = c.toArray(); int numNew = a.length; if(numNew == 0){ return false; } Node<E> pred, succ; if(index == size){ succ = last; pred = null; }else{ succ = node(index); pred = succ.prev; } for(Object o : a){ @SuppressWarning("unchecked") E e = (E) o; Node<E> newNode = new Node<>(pred, e, null); if(pred == null){ first = newNode; }else{ pred.next = newNode; } pred = newNode; } if(succ == null){ last = pred; } else { pred.next = succ; succ.prev = pred; } size++; modCount++; return true; }
Node<E> node(int index){ if(index > (size >> 1)){ Node<E> x = first; for(int i = 0; i < index; i++){ x = x.next; } return x; }else{ Node<E> x = last; for(int i = size - 1; i > index; i--){ x = x.prev; } return x; } }
|
实现
自己模拟写的LinkedList,由于实现List、Deque等接口需要实现太多的方法,我就没有实现这些接口,仅仅写点代码表示LinkedList的基本思路。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| class LinkedList<E> { private int size; private Node<E> first; private Node<E> last;
private void linkFirst(E e){ final Node<E> f = first; final Node<E> newNode = new Node<>(null, e, f); first = newNode; if(f == null){ last = newNode; } else { f.prev = newNode; } size++; }
private void linkLast(E e){ final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if(l == null){ first = newNode; } else { l.next = newNode; } size++; }
private void linkBefore(E e, Node<E> succ){ final Node<E> pred = succ.prev; final Node<E> newNode = new Node<>(pred, e, succ); succ.prev = newNode; if(pred == null){ last = newNode; } else { pred.next = newNode; } size++; }
private E unlinkFirst(Node<E> f){ final E element = f.item; final Node<E> next = f.next; f.next = null; f.item = null; first = next; if(next == null){ last = null; } else { next.prev = null; } size--; return element; }
private E unlinkLast(Node<E> l){ final E element = l.item; final Node<E> prev = l.prev; l.prev = null; l.item = null; last = prev; if(prev == null){ first = null; } else { prev.next = null; } size--; return element; }
private E unlink(Node<E> x){ final E element = x.item; final Node<E> prev = x.prev; final Node<E> next = x.next; if (prev == null) { first = next; } else { prev.next = next; x.prev = null; } if (next == null) { last = prev; } else { next.prev = prev; x.next = null; } x.item = null; size--; return element; } private static class Node<E>{ Node<E> prev; E item; Node<E> next; Node(Node<E> prev, E element, Node<E> next){ this.prev = prev; this.item = element; this.next = next; } } }
|