Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t可视化在链表末尾插入节点_Java_Linked List - Fatal编程技术网

Java Can';t可视化在链表末尾插入节点

Java Can';t可视化在链表末尾插入节点,java,linked-list,Java,Linked List,我目前正试图理解和可视化Java中的链表 我了解链表的基本概念以及如何将节点添加到列表的开头。但是,我不理解如何将新节点添加到链表的末尾 例如,在以下代码中: 公共类链接列表 { 节点头;//列表头 /*链表节点*/ 类节点 { int数据; 节点下一步; 节点(int d){data=d;next=null;} } public void append(int new_数据) { /*1.分配节点& 2.输入数据 3.将next设置为null*/ Node new_Node=新节点(新_数据)

我目前正试图理解和可视化Java中的链表

我了解链表的基本概念以及如何将节点添加到列表的开头。但是,我不理解如何将新节点添加到链表的末尾

例如,在以下代码中:

公共类链接列表
{
节点头;//列表头
/*链表节点*/
类节点
{
int数据;
节点下一步;
节点(int d){data=d;next=null;}
}
public void append(int new_数据)
{
/*1.分配节点&
2.输入数据
3.将next设置为null*/
Node new_Node=新节点(新_数据);
/*4.如果链接列表为空,则将
作为头部的新节点*/
if(head==null)
{
head=新节点(新_数据);
返回;
}
/*5.这个新节点将是最后一个节点,所以
将下一个设置为null*/
new_node.next=null;
/*6.否则遍历到最后一个节点*/
最后一个节点=头部;
while(last.next!=null)
last=last.next;
/*7.更改最后一个节点的下一个节点*/
last.next=新节点;
返回;
}
公共静态void main(字符串[]args)
{
/*从空列表开始*/
LinkedList llist=新LinkedList();
//插入6。这样链表变成6->NUllist
附加(6);
//在末尾插入4。这样链表就变为
//6->4->空列表
附加(4);
plist.printList();
}
公共作废打印列表()
{
节点tnode=头部;
while(tnode!=null)
{
System.out.print(tnode.data+“”);
tnode=tnode.next;
}
}
}
虽然我可以可视化遍历(
last
到达
llist
的末尾),但我不明白为什么
last=last.next
(在
public void append(int new_data)
中)将节点链接到上一个节点(为什么上一个
。下一个
指向它)


谢谢你的支持

基本链表只是从头节点开始,列表中的每个节点指向列表中的下一个节点。最后一个节点将其
next
设置为
null
,直到添加新节点,此时新节点成为最后一个节点

因此,这里的逻辑是:

/* 6. Else traverse till the last node */
        Node last = head;
        while (last.next != null)
            last = last.next;

        /* 7. Change the next of last node */
        last.next = new_node;
它从头部开始,然后查看下一个
。如果它不是
null
,则表示它仍然不是列表的实际最后一个节点,因此它将
last
变量设置为下一个。直到最后它找到一个将其
next
设置为
null
的。
last
变量仅在while循环完成时才是实际的最后一个变量


然后,它只是将
last
节点的
next
设置为新节点。新节点已经将其
next
设置为
null
,因此下一次遍历时,它将是
最后一个
节点。

如果您只是将代码更改为类似的内容,该内容仍然相同,但提供了另一个视角,可能会有所帮助。有时变量的命名会让您感到困惑

为了更好地理解,请将
last
重命名为
current
,因为您从头部开始,然后依次查看每个节点,直到找到一个节点,其中
next
指向
null
,表示列表结束

请记住,
.next
本身是一个节点,
current
用作迭代器。 您还可以将其编写为
for
循环:

Node current = head;
for(current; current.next != null; current.next)
//now current refers to the last node since current.next now points to null
current.next = new_node;
//The new end is now new_node - new_node.next points to null

这里有一个,希望能有所帮助。我知道
last
应该放在列表的末尾,我也知道
last的方式和原因。下一个
指向
新节点。我不明白的是,前一个节点如何以及为什么有一个指向
last
的指针。在当前代码中,为什么
last
链接到另一个元素?它是否应该是值为6的节点的副本(因此不链接到以前的节点)?在下面的可视化中,我不理解步骤34>35:shorturl.at/amIO5
last
没有放在任何地方。它只是对已经存在的节点的引用。这就像你的手指沿着列表中的节点链,从头部开始(上面写着
Node last=head
),然后通过检查指向下一个节点的
next
引用来完成,因此将手指移动到列表中的下一项。这就是while循环中正在发生的事情。当没有其他内容(while循环中的条件)时,您知道
last
指向列表的实际结束节点。因此,新的_节点将跟踪它。您可以通过设置
last.next
参考来实现。