我正在阅读链接列表here,我有点困惑。我已经把它画出来但看起来它们仍然是一样的。
浏览链表:
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分配给新节点旁边的点。
答案 0 :(得分:4)
在使用
的第一个循环中temp!= null
您将迭代链表并完全交叉。当您必须只打印链表的所有元素时,它会很有用。但是如果在最后添加节点,则必须停在最后一个节点,以便可以将新节点附加到last.next节点。
temp.next != null
确保它会在temp.next is actually null
的最后一个节点停止。
在使用1st时,你将无法在最后一个节点停止,但在使用第二个时,你必须在一个新节点附近停止,否则你将通过它。
Q值。他们是一回事吗?
不,他们不是。
问题的最后一段是正确的
我对while循环的思考过程:tmp从头开始。现在,当tmp指向下一个节点时,tmp继续指向它旁边的节点。它继续,直到tmp没有指向它旁边的另一个节点。然后它突破循环并将tmp分配给新节点旁边的点。
现在添加它,第一种情况是 temp 本身将变为 null
答案 1 :(得分:2)
在循环结束后,考虑一下tmp
将成为。使用tmp != null
,tmp
只能 为null
,这是无用的;你不能对null
做任何事情。
循环之后,您希望tmp
成为 last 节点,因此您可以向其添加新节点。除了最后一个节点之外的所有节点都有下一个节点,因此检查tmp.next != null
意味着当循环退出时,tmp.next
将为null
,这对于最后一个节点仅为真。
如果变量名为last
(而不是tmp
),则代码会更清晰。