为了账号安全,请及时绑定邮箱和手机立即绑定

每个节点在链表中扮演什么角色?

每个节点在链表中扮演什么角色?

斯蒂芬大帝 2021-11-03 15:03:22
为什么每次我们创建新节点时p.next都需要将null分配给this.next?无论如何都不总是空的?它扮演什么角色LinkedList?如果我们尝试将其打印出来this.next,则在将其分配给null之前它将为null。System.out.println(this.next);结果为空另外如果p.next指向新的node为什么我们需要设置p = p.next指向同一个节点?如果目的是最后将tail设置为p,我们不能只设置tail = p.nextfor循环完成后的最后一个。public class EnkeltLenketListe<T>{private T value;private Node<T> next;private Node(T value, Node<T> next){System.out.println(this.next);    this.next = next;    this.value = value;}}private Node<T> head, tail;public EnkeltLenketListe(T[] a){this();int i = 0; for (; i < a.length && a[i] == null; i++);if (i < a.length){    head = new Node<>(a[i], null);    Node<T> p = head;    for (i++; i < a.length; i++)    {        if (a[i] != null)        {            p.next = new Node<>(a[i], null);            p = p.next;        }    }    tail = p;}}
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

为什么每次创建新节点 p.next 时都需要给 this.next 赋值为 null?

在添加和删除节点时,我们必须确保节点不指向非预期节点。他们可能指向了一些节点。

为什么我们需要设置 p = p.next 指向同一个节点

要在遍历列表时定位并保持您在列表中的位置,您可以从头开始,并继续到剩余的节点。如果 p=p.next,将如何遍历列表?

我们不能只设置 tail = p.next 这是 for 循环完成后的最后一个。

不,我们不能因为在这种情况下p.next相当于p.p.next因为p被设置为p.next循环内部。通过在之前添加以下内容对其进行测试tail=p,您应该得到null

System.out.println(p.next);


编辑:

您的列表是单链表,这意味着除尾部之外的每个节点都应该有一个指向下一个节点的指针,您从

head = new Node<>(a[i], null);
Node<T> p = head;

在这种情况下phead并指向Node 0见下图。如果数组中的下一个 NOde 不为空,让我们看看 for 循环中会发生什么

    p.next = new Node<>(a[i], null);
    p = p.next;

在这种情况下p.next是指向Node 1(见下图),其中 as pwhich 指向Node 0现在设置为指向 Node 1。所以两者都指向“节点 1”。最后一个:

tail = p;

你说那我们为什么不tail=p.next呢?不,我们不能因为在这种情况下p.next相当于p.p.next因为p被设置为p.next循环内部。

//img1.sycdn.imooc.com//6182345e00019de606240120.jpg

查看完整回答
反对 回复 2021-11-03
?
不负相思意

TA贡献1777条经验 获得超10个赞

尝试使用矛盾。如果您没有设置p = p.next,在循环的下一次迭代中,您将再次将新节点设置为前一个节点的下一个位置。因此,所有的时间p都是,head而你不再移动p了!

因此,您需要p在设置后在每次迭代中移动p.next。实际上,它是指向列表最后一个元素的指针。


查看完整回答
反对 回复 2021-11-03
  • 2 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信