首页 新闻 会员 周边

linkedList源码 addAll(int index, Collection<? extends E> c)方法

1
[已解决问题] 解决于 2021-09-10 09:18

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的我只要构造了就可以调用吧。
我调用的时候传进来一个不在链表最后插入的集合,那我链表后面的数据不都被删完了吗

一只小白鼠~的主页 一只小白鼠~ | 菜鸟二级 | 园豆:204
提问于:2021-05-21 15:13
< >
分享
最佳答案
0

循环的最后一步pred = newNode; 也就是在每一次循环中会将上一次循环中新建的节点的next指向本次循环的新节点

奖励园豆:5
xjint | 菜鸟二级 |园豆:209 | 2021-05-21 16:39

懂了,刚没看到else,感谢

一只小白鼠~ | 园豆:204 (菜鸟二级) | 2021-05-21 16:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册