我正在为链表编写插入方法,发现有一件事难以理解。它在使用此代码遍历时有效:
class Node {
int data;
Node next;
Node(int d) {
data = d;
next = null;
}
}
public static Node insert(Node head,int data) {
Node conductor = head;
if(conductor == null){
head = new Node(data);
}
else{
while(conductor.next != null){
conductor = conductor.next;
}
conductor.next = new Node(data);
}
return head;
}
但如果我将while循环更改为:
while(conductor != null){
conductor = conductor.next;
}
conductor = new Node(data);
它不起作用。我不明白其中的区别。 有人可以帮忙吗?
答案 0 :(得分:0)
当第一个循环停止时,conductor
保存对列表中最后一个节点的引用,即它是next
为空的节点。这是您要修改的节点,您可以使用conductor.next = new Node(data)
进行修改。
使用第二个循环,当conductor
为null
时,它会停止,这完全没用,几乎肯定不是你想要的。
答案 1 :(得分:0)
问题在于,如果迭代元素直到找到null
,则会将conductor
设置为新的Node
,这将与列表的其余部分无法连接:
[node0] -> [node1] -> `null` ... [node2] -> null
^^^-- your inserted element
您想要的是找到最后元素,并将新的Node
作为最后一个元素的next
附加。这就是它被称为链表的原因。当您insert
从最后一个元素到下一个元素创建链接时:
[node0] -> [node1] -> [node2] -> null
^^^-- your inserted element
答案 2 :(得分:0)
让我们说链接列表
1→2→3→5→空
你写的循环在到达空指针时停止并创建一个新节点但不在当前的下一个节点上打破了“5”和你正在创建的新节点之间的链接,因此没有新的节点附加到链接列表。
所以当我们发现当前的next是null并且我们必须在当前的下一个位置添加新节点时我们必须停止循环
答案 3 :(得分:-1)
您必须了解您的本地变量Node conductor
是对象的引用,而不是对象本身,也不是对象的副本。
因此,在循环结束时conductor = new Node(data);
只需将此参考积分转换为全新的对象。它不会改变列表本身。