public boolean addAll(int index, Collection<? extends E> c) {
//1:检查index范围是否在size之内
checkPositionIndex(index);
//2:toArray()方法把集合的数据存到对象数组中
Object[] a = c.toArray();
int numNew = a.length;
if (numNew == 0)
return false;
//3:得到插入位置的前驱节点和后继节点
Node<E> pred, succ;
//如果插入位置为尾部,前驱节点为last,后继节点为null
if (index == size) {
succ = null;
pred = last;
}
//否则,调用node()方法得到后继节点,再得到前驱节点
else {
succ = node(index);
pred = succ.prev;
}
// 4:遍历数据将数据插入
for (Object o : a) {
@SuppressWarnings("unchecked") E e = (E) o;
//创建新节点
Node<E> newNode = new Node<>(pred, e, null);
//如果插入位置在链表头部
if (pred == null)
first = newNode;
else
pred.next = newNode;
pred = newNode;
}
//如果插入位置在尾部,重置last节点
if (succ == null) {
last = pred;
}
//否则,将插入的链表与先前链表连接起来
else {
pred.next = succ;
succ.prev = pred;
}
size += numNew;
modCount++;
return true;
}
各位大佬好,最近在看linkedList源码,看到了addAll()这个方法,在遍历往列表插入信息的时候不是特别明白, Node<E> newNode = new Node<E>(pred, e, null) .这是怎么确定后继节点为null的?
这个方法是public的我只要构造了就可以调用吧。
我调用的时候传进来一个不在链表最后插入的集合,那我链表后面的数据不都被删完了吗
循环的最后一步pred = newNode;
也就是在每一次循环中会将上一次循环中新建的节点的next指向本次循环的新节点
懂了,刚没看到else,感谢