节点为node != null和node.next == null的区别是什么?

3
我正在学习链表,这里有相关内容,但我有些困惑。我已经画出来了,但它们看起来仍然是相同的东西。
遍历链表:
Node tmp = head;
while(tmp != null) {
     tmp = tmp.next;
}

对于while循环的思路:tmp从头部开始。现在当tmp指向下一个节点时,tmp将继续指向其旁边的节点。并且这将一直进行,直到tmp没有指向其旁边的其他节点为止。

在链表末尾添加元素:

public void addLast(AnyType item)
{
   if(head == null) addFirst(item);
   else
   {
      Node<AnyType> tmp = head;
      while(tmp.next != null) 
            tmp = tmp.next;

      tmp.next = new Node<AnyType>(item, null);
   }
}

对于while循环的思路:tmp从头开始。现在,当tmp指向下一个节点时,tmp会移动到指向其旁边的节点。这样一直进行,直到tmp没有指向另一个旁边的节点为止。然后它跳出循环并将tmp指向新节点的旁边。


2
当你不理解代码时,最好的做法是在IDE调试器中逐步执行它,检查每一步的变量以查看发生了什么变化。大多数调试器甚至会为您在每个步骤中突出显示已更改的变量。 - Jim Garrison
@JimGarrison,你建议用哪个IDE实现这个功能? - sukiyo
Eclipse或NetBeans或IntelliJ - Jim Garrison
@JimGarrison 我有IntelliJ!但是我该如何逐步执行我的代码呢?我只是运行代码。 - sukiyo
@sukiyo 请阅读并在调试部分中进行操作。 - Brij Raj Kishore
3个回答

6

在第一个循环中使用

temp != null

你将遍历整个链表。当你只需打印链表的所有元素时,这可能很有用。但是,在添加节点到最后一个节点的情况下,您必须停止在最后一个节点,以便您可以将新节点附加到last.next节点。

temp.next != null 确保它会停在最后一个节点,其中 temp.next 实际上为null。 使用第一种方法时,您无法停在最后一个节点,但使用第二种方法时,您仅停在必须附加新节点的位置,即在最后一个节点处,否则您将超过它。

问:它们是相同的吗?

不,它们不同。

问题的最后一段是正确的

我的while循环思路:tmp从头开始。现在,当tmp指向下一个节点时,tmp继续指向其旁边的节点。它会一直持续到tmp没有指向另一个节点。然后它跳出循环并将tmp分配为指向一个新节点的下一个节点。

现在补充说明,第一种情况是您的temp本身将变为null


非常感谢!你说的“你的 temp 本身将变为 null”是什么意思?这意味着 temp 内部的数据吗? - sukiyo
1
@sukiyo,你可以说临时数据将变为null,或者如果你了解引用变量或指针,那么在这种语言中它将指向null。在null处,你将无法执行任何操作。因此,当你到达最后一个节点时,只有添加另一个节点才是正确和有意义的。如果你尝试向null添加节点,那将是错误和毫无意义的。 - Brij Raj Kishore

2
想一想循环结束后tmp会是什么。由于tmp != null,所以tmp只能是null,这是无用的;你不能对一个null做任何事情。
在循环后,您希望tmp成为最后一个节点,以便可以向其中添加新节点。除了最后一个节点之外,所有节点都有下一个节点,因此检查tmp.next != null意味着当循环退出时,tmp.next将是null,这仅适用于最后一个节点。
如果变量命名为last(而不是tmp),代码会更清晰。

0
长话短说,tmp.nxt 的基本作用是检查是否有连接下一个节点的链接。所以在迭代循环中,如果有n个节点,则它将运行n-1次。但是,node!= null会运行n次,因为node!= null正在检查节点的存在。

1
目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接