Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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 末端双LL插入卡在回路上_Java_Data Structures - Fatal编程技术网

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's
next
字段为空。您只想将
last.next
设置为
newNode
一次
last.next==null
(当您到达列表末尾时):


while
循环中:

while(last!=null) {
    last = last.next;
    last.next = newNode;
}
第二行将
last.next
设置为
newNode
,因此在下一次迭代中,
last
将设置为
newNode
,who's
next
字段为空。您只想将
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;}