关于节点头创建的问题。

关于节点头创建的问题。

public void addFirst(E e) {
    Node node = new Node(e);
    node.next = head;
    head = node;
    size ++;
}

public void add(int index, E e) {
    if (index < 0 || index > size) {
        throw new IllegalArgumentException("add failed, Illegal index");
    }
    if (index == 0) {
        addFirst(e);
    } else {
        Node prev = head;
        for (int i = 0; i < index - 1; i++) {
            prev = prev.next;
        }
        Node node = new Node(e);
        node.next = prev.next;
        prev.next = node;
        //prev.next = new Node(e,prev.next);
        size ++;
    }
}

这两段代码是老师课程里面写出来用于增加节点的, 但是我发现如果这么创建下去的话最后一个节点next始终指向head而不是null. 

假设第一个节点为n1

那么

head = n1

n1.next = head

然后添加一个元素。

n2

也就是

 node.next = prev.next;
prev.next = node;

所以 

n1.next = n2

n2.next = head

所以始终不会指向null的


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
liuyubobobo 2020-09-12 05:59:36

首先,我们最后一个节点是指向 null 的。我们后续会为整个链表做打印输出,就是使用 null 来停止循环的,你可以使用打印输出函数做测试,或者使用单步跟踪的方式,实际看一下每一个 node 节点的 next 指向的是谁。


其次,我没有很理解你描述的过程:


假设第一个节点为n1

那么

head = n1

n1.next = head ???


这里为什么 n1.next = head???代码的哪里让你认为有这样的逻辑?


  • 提问者 慕前端8369922 #1
    第1-2 章节 在链表中添加元素 5.46分开始? public void addFirst(){ head = new Node(e,head) size ++ } 这一句?
    2020-09-12 06:02:31
  • liuyubobobo 回复 提问者 慕前端8369922 #2
    这句是在链表头添加一个节点。新添加的节点因为在链表头,所以新的节点的 next 指向 head,之后因为 head = new Node,所以 head 又指向了新的节点。整个过程没有影响最后一个节点的指向。 在最初 head 为空的时候,new Node(e, head) 中的 head 为空, 所以新节点的 next 指向 null,之后 head 指向了新的节点。 实际多次调用这个函数,单步跟踪一下,看一看这个函数的运行过程中,各个节点是在如何变化的?各个节点的 next 是在如何变化的?为什么会是这样?和你想的是否一样?如果不一样,你的设想哪里错了?进步就发生在这个过程中哦。 加油!:)
    2020-09-12 06:11:33
  • 提问者 慕前端8369922 回复 liuyubobobo #3
    感谢老师指导,一直没有反应过来head刚开始等于null.
    2020-09-12 06:15:52
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2589    人
  • 解答问题       1090    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师