privatevoidlinkFirst(E e) { final Node<E> f = first; final Node<E> newNode = newNode<>(null, e, f); first = newNode; if (f == null) last = newNode; else f.prev = newNode; size++; modCount++; }
linkLast(E) 方法:后
创建并连接最后一个元素。
创建一个 Node 节点
将元素 E 放入其中
前节点设置为 last 节点
后节点设置为 null
1 2 3 4 5 6 7 8 9 10 11
voidlinkLast(E e) { final Node<E> l = last; final Node<E> newNode = newNode<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; }
linkBefore(E, Node) 方法:中
在节点前(非空)插入一个元素。
获取 succ 节点的前节点
创建一个 Node 节点,并放入元素 E
连接前节点和后节点
判断前节点不为空,并将前节点的 next 节点设置为当前节点
1 2 3 4 5 6 7 8 9 10 11 12
voidlinkBefore(E e, Node<E> succ) { // assert succ != null; final Node<E> pred = succ.prev; final Node<E> newNode = newNode<>(pred, e, succ); succ.prev = newNode; if (pred == null) first = newNode; else pred.next = newNode; size++; modCount++; }
3.3 删除节点方法
unlinkFirst(Node) 方法:前
删除并返回链表的第一个的节点(非空)。
获取 f 节点的元素并返回
获取 f 节点的 next 节点
将 next 节点设置为 first 节点
将 next 节点的前节点设置为 null
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
private E unlinkFirst(Node<E> f) { // 元素 f 是第一个,并且 f 不为空 // assert f == first && f != null; finalEelement= f.item; final Node<E> next = f.next; f.item = null; f.next = null; // help GC,GC垃圾自动回收 first = next; if (next == null) last = null; else next.prev = null; size--; modCount++; return element; }
unlinkLast(Node) 方法:后
删除并返回链表的最后一个节点(非空)。
获取 l 节点的元素并返回
获取 l 节点的 prev 节点
将 prev 节点设置为 last 节点
将 prev 节点的后节点设置为 null
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
private E unlinkLast(Node<E> l) { // 元素 l 是最后一个,并且 l 不为空 // assert l == last && l != null; finalEelement= l.item; final Node<E> prev = l.prev; l.item = null; l.prev = null; // help GC,GC垃圾自动回收 last = prev; if (prev == null) first = null; else prev.next = null; size--; modCount++; return element; }
publicbooleanremoveLastOccurrence(Object o) { if (o == null) { // 非 null 元素 // 从 last 节点开始,向前循环迭代 for (Node<E> x = last; x != null; x = x.prev) { if (x.item == null) { unlink(x); returntrue; } } } else { // null 元素 for (Node<E> x = last; x != null; x = x.prev) { if (o.equals(x.item)) { unlink(x); returntrue; } } } returnfalse; }
// 删除指定元素 publicbooleanremove(Object o) { if (o == null) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) { unlink(x); returntrue; } } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) { unlink(x); returntrue; } } } returnfalse; }
Node<E> node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node<E> x = first; for (inti=0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (inti= size - 1; i > index; i--) x = x.prev; return x; } }
7.3 元素搜索操作
indexOf(Object) 方法
返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
publicintindexOf(Object o) { intindex=0; if (o == null) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) return index; index++; } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) return index; index++; } } return -1; }
lastIndexOf(Object) 方法
返回此列表中指定元素最后一次出现的索引,如果此列表不包含该元素,则返回-1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
publicintlastIndexOf(Object o) { intindex= size; if (o == null) { for (Node<E> x = last; x != null; x = x.prev) { index--; if (x.item == null) return index; } } else { for (Node<E> x = last; x != null; x = x.prev) { index--; if (o.equals(x.item)) return index; } } return -1; }