Java 末端双LL插入卡在回路上
我似乎不明白为什么在双链接列表的末尾插入节点会陷入循环。它要么卡在循环中,要么是空指针。另外,我想知道在处理链表或任何数据结构时,公共节点是更好还是公共无效Java 末端双LL插入卡在回路上,java,data-structures,Java,Data Structures,我似乎不明白为什么在双链接列表的末尾插入节点会陷入循环。它要么卡在循环中,要么是空指针。另外,我想知道在处理链表或任何数据结构时,公共节点是更好还是公共无效 public Node insertEnd(int data) { Node newNode = new Node(data); newNode.next = null; if (head == null) { head = newNode; return newNode; }
public Node insertEnd(int data) {
Node newNode = new Node(data);
newNode.next = null;
if (head == null) {
head = newNode;
return newNode;
}
Node last = head;
while(last!=null) {
last = last.next;
last.next = newNode;
}
newNode.previous = last;
return newNode;
}
在
while
循环中:
while(last!=null) {
last = last.next;
last.next = newNode;
}
第二行将last.next
设置为newNode
,因此在下一次迭代中,last
将设置为newNode
,who'snext
字段为空。您只想将last.next
设置为newNode
一次last.next==null
(当您到达列表末尾时):
在
while
循环中:
while(last!=null) {
last = last.next;
last.next = newNode;
}
第二行将last.next
设置为newNode
,因此在下一次迭代中,last
将设置为newNode
,who'snext
字段为空。您只想将last.next
设置为newNode
一次last.next==null
(当您到达列表末尾时):
嗯,这是因为这部分逻辑
Node last = head;
while(last!=null) {
last = last.next;
last.next = newNode; //// This shouldn't happen.
}
一旦已经创建了链表,您将尝试转到最后一个元素。但是,在遍历过程中,您还更改了节点指向的下一个指针
尝试将逻辑更改为:
public Node insertEnd(int data) {
Node newNode = new Node(data);
newNode.next = null;
if (head == null) {
head = newNode;
return newNode;
}
Node last = head;
while(last.next != null) {
last = last.next;
}
last.next = newNode;
newNode.previous = last;
return newNode;
}
嗯,这是因为这部分逻辑
Node last = head;
while(last!=null) {
last = last.next;
last.next = newNode; //// This shouldn't happen.
}
一旦已经创建了链表,您将尝试转到最后一个元素。但是,在遍历过程中,您还更改了节点指向的下一个指针
尝试将逻辑更改为:
public Node insertEnd(int data) {
Node newNode = new Node(data);
newNode.next = null;
if (head == null) {
head = newNode;
return newNode;
}
Node last = head;
while(last.next != null) {
last = last.next;
}
last.next = newNode;
newNode.previous = last;
return newNode;
}
至于问题的第二部分,这取决于此API的客户端/调用方期望输出的方式 您正在编写此API以用于正在编写的另一个程序吗?在这种情况下,请考虑将新创建的节点作为此API的返回值是否有用,或者将其保留为void是否可以接受
作为参考,API的Java实现将
void
作为返回类型。()至于问题的第二部分,这取决于此API的客户端/调用方期望输出的方式
您正在编写此API以用于正在编写的另一个程序吗?在这种情况下,请考虑将新创建的节点作为此API的返回值是否有用,或者将其保留为void是否可以接受
作为参考,API的Java实现将
void
作为返回类型。()要回答第一部分,您需要对代码进行以下更改-
Node last = head;
while(last.next!=null) { // be careful- it should be last.next!=null instead of last!=null , as it will give null pointer exception.
last = last.next;
}
last.next = newNode;
newNode.previous = last;
return newNode;
正如while循环中的语句“last.next=newNode;”在第一次迭代本身中将last设置为newNode
对于问题的第二部分,这取决于调用函数的要求。要回答第一部分,您需要对代码进行以下更改-
Node last = head;
while(last.next!=null) { // be careful- it should be last.next!=null instead of last!=null , as it will give null pointer exception.
last = last.next;
}
last.next = newNode;
newNode.previous = last;
return newNode;
正如while循环中的语句“last.next=newNode;”在第一次迭代本身中将last设置为newNode
对于问题的第二部分,这取决于调用函数的要求。是的,我已经尝试过了,并将newNode.previous设置为last,但它给了我一个空指针执行选项。@madil26我无法复制此选项。您能发布一个吗?是的,我已经尝试过了,并将newNode.previous设置为last,但它给了我一个空指针执行选项。@madil26我无法复制这个。你可以发布一个吗?这是我在开始时做的,它不起作用,它给了我一个空指针的例外。这是我在开始时做的,它不起作用,它给了我一个空指针的例外。我只是使用节点,它使我更容易掌握链表的概念。但从我的理解来看,只要它有效,它的无效或节点就不重要,但我知道它不是惯例,当它涉及到APIs时,你的理解是正确的,在这种情况下,只要它有效,它就不重要。另外,由于您的初始问题尚未解决,您能否使用NPE的堆栈跟踪更新该问题?当您第一次或以后插入时,它是否会抛出NPE?公共节点插入(int data){Node newNode=newNode(data);newNode.next=null;if(head==null){head=newNode;return newNode;}Node last=head;while(last.next!=null){last=last.next;}last.next=newNode;newNode.previous=last;return newNode;}我刚刚使用的节点使我更容易掌握链表的概念。但从我的理解来看,只要它有效,它的无效或节点就不重要,但我知道它不是惯例,当它涉及到APIs时,你的理解是正确的,在这种情况下,只要它有效,它就不重要。另外,由于您的初始问题尚未解决,您能否使用NPE的堆栈跟踪更新该问题?当您第一次或以后插入时,它是否会抛出NPE?公共节点插入(int data){Node newNode=newNode(data);newNode.next=null;if(head==null){head=newNode;return newNode;}Node last=head;while(last.next!=null){last=last.next;}last.next=newNode;newNode.previous=last;return newNode;}