循环链接列表

时间:2017-05-12 10:13:57

标签: java linked-list

我在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总是为空?

任何教育都将受到赞赏。

谢谢。

3 个答案:

答案 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)同样的想法,currentNodeNode4,因为没有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)。只有这样,它就在列表的尾部,退出循环。