//传入集合,调用addAll进行添加 publicLinkedList(Collection<? extends E> c) { this(); addAll(c); }
API
linkFirst
将元素添加到头部。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
privatevoidlinkFirst(E e) { final Node<E> f = first; //新节点的前驱节点为null,后继节点为原来的头节点 final Node<E> newNode = newNode<>(null, e, f); first = newNode; //如果头节点为空 if (f == null) //新插入的既是头节点,也是尾节点。 last = newNode; else //将原来头节点的前驱指针指向新节点 f.prev = newNode; size++; modCount++; }
linkLast
将元素添加到尾部。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
voidlinkLast(E e) { final Node<E> l = last; //新节点的后继节点为null,前驱节点为原来的尾节点 final Node<E> newNode = newNode<>(l, e, null); last = newNode; //如果尾节点为空,直接将新节点设置为头节点 if (l == null) first = newNode; else //否则将原来的尾节点后继指向新节点 l.next = newNode; size++; modCount++; }
linkBefore
在一个非空节点前插入元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
voidlinkBefore(E e, Node<E> succ) { // assert succ != null; final Node<E> pred = succ.prev; //插入节点的前驱为succ的前驱,后继节点为succ final Node<E> newNode = newNode<>(pred, e, succ); //设置succ的前驱指针 succ.prev = newNode; //如果succ的前驱节点为空 if (pred == null) //新插入的节点为头节点 first = newNode; else //否则succ的前驱节点的后继指针指向新节点 pred.next = newNode; size++; modCount++; }
Node<E> node(int index) { //如果下标小于size/2,从头节点开始遍历 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; } }
indexOf
返回元素第一次出现的下标。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
publicintindexOf(Object o) { intindex=0; if (o == null) { //o为null时,从头结点开始找到第一个null节点 for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) return index; index++; } } else { //否则从头开始找与o匹配的 for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) return index; index++; } } return -1; }
lastIndexOf
找到最后一个匹配的下标。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
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; }
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++; }