Object[] a = c.toArray(); // 新增元素的数量 int numNew = a.length; if (numNew == 0) returnfalse; // 前置节点和后置节点 Node<E> pred, succ; // index == size时表示是从链表尾部添加元素,所以前置节点为当前链表的尾节点 if (index == size) { succ = null; pred = last; } else { // 不是从链表尾部添加,需要修改前置节点和后置节点 succ = node(index); pred = succ.prev; }
for (Object o : a) { @SuppressWarnings("unchecked") E e = (E) o; Node<E> newNode = new Node<>(pred, e, null); // 前置节点为null,表示这是头节点 if (pred == null) first = newNode; else pred.next = newNode; pred = newNode; } // succ == null,说明是从尾部添加的,将最后一个节点赋给尾节点 if (succ == null) { last = pred; } else { pred.next = succ; succ.prev = pred; }
size += numNew; modCount++; returntrue; }
// 获取index位置的节点 Node<E> node(int index){ // assert isElementIndex(index); // index小于链表长度的一半,从链表头部开始遍历 if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { // index不小于链表长度的一半,从链表尾部开始遍历 Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } }
// 逻辑比较简单,与上边addAll类似,一通插 publicvoidadd(int index, E element){ checkPositionIndex(index); // index == size表示在链表尾部添加 if (index == size) linkLast(element); else// 否则在中间插入 先找到index所在位置的节点 linkBefore(element, node(index)); }
voidlinkLast(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++; modCount++; }
voidlinkBefore(E e, Node<E> succ){ // assert succ != null; final Node<E> pred = succ.prev; final Node<E> newNode = new Node<>(pred, e, succ); succ.prev = newNode; if (pred == null) first = newNode; else pred.next = newNode; size++; modCount++; }