我在Main.java中有以下代码,试图实现从书中获取的链表。这是一个非常基本的问题,但让我发疯。非常感谢帮助!
class Node {
Node next = null;
int data;
public Node (int d) {
data = d;
}
void appendToTail (int d) {
Node tailNode = new Node (d);
Node currentNode = this;
while (currentNode.next != null) {
currentNode = currentNode.next;
}
currentNode.next = tailNode;
}
}
class Main {
public static void main (String args[]) {
Node n = new Node(10);
n.appendToTail (11);
n.appendToTail (12);
n.appendToTail (13);
}
}
所以,在n.appendToTail(13); 以下循环运行两次: while(currentNode.next!= null){... 并在n.appendToTail(14);相同的循环运行三次 等等 为什么?我不明白。
我也不理解该循环的目的 - 为什么当前的currentNode.next总是为空?
任何教育都将受到赞赏。
谢谢。
答案 0 :(得分:1)
简单地说,currentNode.next = tailNode;
将新的Node
链接到尾部
> : represent a .next link
Node1 > Node2 > Node3
调用appendToTail(4)
,循环将currentNode
引用Node3
(尚未>
),然后将新节点添加到此currentNode.next
< / p>
Node1 > Node2 > Node3 > Node4
拨打appendToTail(5)
同样的想法,currentNode
将Node4
,因为没有next
值
Node1 > Node2 > Node3 > Node4 > Node5
循环就在这里找到结束(由缺少next
值表示)
答案 1 :(得分:0)
引用n始终指向第一个节点。当你这样做
Node currentNode = this;
在每个函数调用currentNode指向第一个Node。 所以当你这样做时
n.appendToTail (11);
没有循环会运行,因为只有一个节点。当你这样做
n.appendToTail (13);
已经有三个节点,所以它会循环两次
答案 2 :(得分:0)
n
指向列表的头部(Node(10)
)。每次通过调用n.appendToTail()
将节点添加到列表中时,while循环将从头部开始,并为列表中的每个节点循环一次,直到它到达尾部。
第一次调用它时,它根本不循环,因为while循环上的条件为false;列表中只有一个节点,因此它已经位于列表的尾部(currentNode.next == null
)。第二次,它运行一次因为列表中现在有两个项目:第一个循环从Node(10)
到Node(11)
,然后它找到一个null,它退出循环。
对于第三个n.appendToTail()
,它会循环一次,从Node(10)
移至Node(11)
,然后再次从Node(11)
移至Node(12)
。只有这样,它就在列表的尾部,退出循环。