我很感激任何帮助,不确定我是否正确理解了这段代码。
所以我使用Scanner来填充列表中每个节点的数据。我使用int N = in.nextInt()
给我的列表一个大小。我们先说N == 2
。
这段代码实际上如何运作?我试图画它,谷歌,但仍不确定我是否理解正确。
public static Node readList(Scanner in) {
int N = in.nextInt();
Node head = new Node(-1);
Node node = head;
for (int i = 0; i < N; i++) {
node.next = new Node(in.nextInt());
node = node.next;
}
return head.next;
}
所以我在想:
Node head = -1
;另一个Node node = head
(不确定我们为什么需要它)。
比循环I < N
(例如2),所以2次键盘输入。
输入将转到下一个(意味着它是指向下一个的链接),然后Node node
将被覆盖,而不是 -1 ,它是 5 (例如,它是第一个输入)。
现在我们有了节点node = 2
。下一个输入是 10 ,所以接下来再次输入。我们有node = 2; node.next = 10
。它是否有意义或我的逻辑不正确?
我对接下来会发生什么感到困惑?我们如何返回head.next
(意味着它的价值)?
答案 0 :(得分:1)
第一步:读取列表的大小(N)
第二步:创建列表的头部(变量头)
第三步:创建一个节点变量,该变量将保存列表中当前处理的节点并使其等于head(因为当前节点是头节点)
现在做一个循环,进行N次迭代,并在每次迭代时执行:
循环1)使用行new Node(in.nextInt());
创建一个新节点,并从扫描仪初始化它。
循环2)节点是列表的当前位置。将循环1)中的新节点用作具有赋值node.next = new Node(in.nextInt());
循环3)当前节点现在是前面步骤中创建的下一个节点(链接列表中的最后一个节点)node = node.next;
REPEAT ...
如果更容易理解,你可以重写循环:
for (int i = 0; i < n; i++) { //use n instead of N because of java conventions
int input=in.nextInt();
Node theNewLastNodeInTheList = new Node(input);
currentNode.next = theNewLastNodeInTheList;
currentNode = theNewLastNodeInTheList;
}
答案 1 :(得分:0)
看看班级Node
的样子会很有趣:
public class Node {
private int value;
public Node next;
public Node(int value) {
this.value = value;
}
}
因此,对于您的代码,首先创建的节点head
包含值-1。然后,对于从0到N的每个值,将创建一个新节点并将其作为当前节点的下一个节点。然后将当前节点设置为下一个节点,以便可以设置该节点的下一个节点。
假设输入为5和10,我们将有三个节点:head
节点,其值为-1。头节点的next
值是值为5的节点,该节点的next
值是值为10的节点。
该方法的返回值是在head
节点之后创建的节点,因此您永远不会知道head
节点的存在。您将能够从头部后面的节点开始访问节点。
也许看看这个:Stacks and queues