通过扫描仪

时间:2018-04-10 07:11:18

标签: java linked-list java.util.scanner

我很感激任何帮助,不确定我是否正确理解了这段代码。

所以我使用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(意味着它的价值)?

2 个答案:

答案 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