Java 在链表中循环

Java 在链表中循环,java,linked-list,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 current

我在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)上; 以下循环运行两次: 而(currentNode.next!=null){。。。 在n.appendToTail(14)上,相同的循环运行三次 等 为什么?我不明白

我也不明白这个循环的目的-为什么currentNode.next不总是空的

任何教育都将不胜感激


谢谢。

原因很简单,因为
currentNode.next=tailNode;
正在将新的
节点链接到尾部

>:表示一个.下一个链接

Node1 > Node2 > Node3
调用
appendToTail(4)
,循环将为
currentNode
提供
Node3
(还没有
)的引用,然后将新节点放到该
currentNode。下一步

Node1 > Node2 > Node3 > Node4
调用
appendToTail(5)
,同样的想法,
currentNode
将具有
Node4
,因为该值是no
next

Node1 > Node2 > Node3 > Node4 > Node5

循环在这里只是为了找到结束点(由缺少
next
值表示)

引用n始终指向第一个节点

Node currentNode = this;
n.appendToTail (13);
在每次函数调用中,currentNode都指向第一个节点。 所以当你这么做的时候

n.appendToTail (11);
因为只有一个节点,所以不会运行任何循环

Node currentNode = this;
n.appendToTail (13);

已经有三个节点,因此它将循环两次
n
指向列表的头部(
node(10)
)。每次通过调用
n.appendToTail()
向列表添加节点时,while循环将从头部开始,并为列表中的每个节点循环一次,直到到达尾部

第一次调用它时,它根本不循环,因为while循环的条件为false;列表中只有一个节点,因此它已经位于列表的尾部(其中
currentNode.next==null
)。第二次,它运行一次,因为列表中现在有两个项:第一个循环从
节点(10)获取它
节点(11)
,然后它找到一个空值,该值退出循环


对于第三个
n.appendToTail()
,它循环一次从
节点(10)
移动到
节点(11)
,然后第二次从
节点(11)
移动到
节点(12)
。然后它才在列表的末尾,退出循环。

因为
currentNode.next=tailNode;
。你的循环转到列表的末尾,将你的新节点
tailNode
添加为currentTail的
下一个
。这意味着每次调用时,它都会迭代到末尾,并向它添加一个新节点,就像我不理解的那样tand currentNode.next(缺乏OO知识):为什么它包含多个(引用)对象?我确信它很简单,只是我不理解它,而且我正在使用的书并没有显示所有这些。非常感谢您的帮助!!
currentNode。next
不包含多个引用,它只对列表中的下一个节点有一个引用。正是该节点依次引用了另一个对象。列表中的每个节点都有one这种引用,除了tail,它的值为空,因为后面没有节点。这就是链表背后的想法:它是一个对象链,每个对象都有一个指向下一个的引用,而不是一个指向所有其他元素的对象(列表的头)。谢谢。关于[node n=this;]语句-这是否总是指原始(第一个)节点?抱歉,这一定是一个基本的OO问题,但我来自一个脚本世界。
将始终指调用该方法的对象。因为您调用了
n.appendToTail(x)
,在方法中使用
this
将引用
n
。您只调用代码中列表开头的方法,因此
this
总是引用第一个节点,尽管您可以在任何其他节点上调用该方法,而
this
将引用该节点(尽管在头以外的任何节点上调用append对于链表来说是不常见的)。