Java 在链表中循环
我在Main.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
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
,因为该值是nonext
值
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对于链表来说是不常见的)。