Java 添加到自定义链表的末尾会在“newNode.data=…”上抛出一个NPE

Java 添加到自定义链表的末尾会在“newNode.data=…”上抛出一个NPE,java,nullpointerexception,linked-list,Java,Nullpointerexception,Linked List,嗨,有人能帮我解决我的LinkedList问题吗。我试图在列表的末尾添加一个存储OBJ的节点,但我似乎不明白它为什么不工作。以下是我目前掌握的代码: public void addLast(int obj) { ListNode newNode = new ListNode(); newNode=head; while(newNode!=null) { newNode=newNode.link; }

嗨,有人能帮我解决我的LinkedList问题吗。我试图在列表的末尾添加一个存储OBJ的节点,但我似乎不明白它为什么不工作。以下是我目前掌握的代码:

public void addLast(int obj)
{
    ListNode newNode = new ListNode();
    newNode=head;
        while(newNode!=null)
        {
            newNode=newNode.link;
        }
        if(newNode==null)
        {
            newNode.data=obj;
        }
如果需要,我可以粘贴整个代码,但这只是我无法正常工作的部分。 目前大约有5个节点包含来自OBJ的数据,因此我使用while循环遍历链接,然后到达包含OBJ的insert newNode的末尾

当前代码在此部分中引发空点异常错误:newNode.data=obj


为什么不起作用?谢谢你的帮助,谢谢

您正在检查它是否为null,并在其后设置它的数据。它将给出一个NPE。到达终点时,执行newNode.link=newNode

ListNode newNode = new ListNode();
newNode.data = obj;
if(head == null)
{ 
   head = newNode;
   return
}

ListNode curr = head;
while(curr.link!=null)
{
   curr=curr.link;
}
// curr now points to last node
curr.link = newNode

您正在检查它是否为null,并在其后设置它的数据。它将给出一个NPE。到达终点时,执行newNode.link=newNode

ListNode newNode = new ListNode();
newNode.data = obj;
if(head == null)
{ 
   head = newNode;
   return
}

ListNode curr = head;
while(curr.link!=null)
{
   curr=curr.link;
}
// curr now points to last node
curr.link = newNode

首先,如果您首先使用头部节点,则无需在此之前创建节点。第二,当你迭代你的结构时,你跳得太远了

public void addLast(int obj)
{
    if (head == null) {
        // If we add an element for the first time
        head = new ListNode();
        head.data = obj;
    } else {
        newNode = head;
        while (newNode.link != null) {
            newNode = newNode.link;
        }
        // Now newNode.link is null
        // Creating the next node
        ListNode temp = new ListNode();
        temp.data = obj;
        // Assigning this new node to the last node's neighbor
        newNode.link = temp;
    }
}

首先,如果您首先使用头部节点,则无需在此之前创建节点。第二,当你迭代你的结构时,你跳得太远了

public void addLast(int obj)
{
    if (head == null) {
        // If we add an element for the first time
        head = new ListNode();
        head.data = obj;
    } else {
        newNode = head;
        while (newNode.link != null) {
            newNode = newNode.link;
        }
        // Now newNode.link is null
        // Creating the next node
        ListNode temp = new ListNode();
        temp.data = obj;
        // Assigning this new node to the last node's neighbor
        newNode.link = temp;
    }
}

条件是

while(newNode.link != null)
并在放入数据之前进行初始化

newNode.link = new ListNode();
newNode.data = obj

条件是

while(newNode.link != null)
并在放入数据之前进行初始化

newNode.link = new ListNode();
newNode.data = obj

我现在得到的答案的解决方案似乎是我想要的,每次我调用addLast实例时,它会存储所有当前链接,并将OBJ数据添加到列表的末尾,最后的代码是:

public void addLast(int obj)
{
    ListNode newNode = new ListNode();
    newNode = head;
    while (newNode.link != null) 
    {
        newNode = newNode.link;
    }          

    ListNode last = new ListNode();
    last.data = obj;
    newNode.link = last; 

}

谢谢大家

我现在得到的答案的解决方案似乎正在按我所希望的方式工作,每次我调用addLast实例时,它都会存储所有当前链接并将OBJ数据添加到列表的末尾,最后的代码是:

public void addLast(int obj)
{
    ListNode newNode = new ListNode();
    newNode = head;
    while (newNode.link != null) 
    {
        newNode = newNode.link;
    }          

    ListNode last = new ListNode();
    last.data = obj;
    newNode.link = last; 

}


谢谢大家

如果newNode为null,您将如何处理newNode.data?如果newNode==null为true,则尝试访问节点的数据。由于节点为空,因此没有任何数据可访问,因此您将获得异常。感谢大家的帮助,我现在意识到我需要另一个节点来容纳OBJ,然后遍历并最终将最后一个节点指向包含OBJ的节点。谢谢真的很感激!如果newNode为null,您将如何处理newNode.data?如果newNode==null为true,则尝试访问节点的数据。由于节点为空,因此没有任何数据可访问,因此您将获得异常。感谢大家的帮助,我现在意识到我需要另一个节点来容纳OBJ,然后遍历并最终将最后一个节点指向包含OBJ的节点。谢谢真的很感激!你需要先处理head是否为null。哦,是的,你说得对。我没想到。我会编辑这篇文章。非常感谢。我认为这个答案可能是最好的。看着它,我明白我错在哪里了。我需要将最后一个节点指向包含OBJ的节点,而不是将空节点指向OBJ。谢谢你需要处理头部是否为空。哦,是的,你说得对。我没想到。我会编辑这篇文章。非常感谢。我认为这个答案可能是最好的。看着它,我明白我错在哪里了。我需要将最后一个节点指向包含OBJ的节点,而不是将空节点指向OBJ。谢天谢地,当head为null时,这不会处理此情况@Dean Duff curr=头部,而不是新节点。newNode将被添加到列表的末尾。我正在添加它。另外,他的问题是如何在末尾添加,甚至在添加到末尾时,您必须处理一个空列表。添加到空列表的末尾意味着设置指向新节点的头指针。另外,您添加的if语句每次都将head设置为null。您忘记了一个=sign。当您同时说您添加的if语句时,您所说的内容每次都会将head设置为null。你忘了一个标志。在这里,你写了ifhead=null,它必须是ifhead==null。这不能处理head为null的情况@Dean Duff curr=头部,而不是新节点。newNode将被添加到列表的末尾。我正在添加它。另外,他的问题是如何在末尾添加,甚至在添加到末尾时,您必须处理一个空列表。添加到空列表的末尾意味着设置指向新节点的头指针。另外,您添加的if语句每次都将head设置为null。您忘记了一个=sign。当您同时说您添加的if语句时,您所说的内容每次都会将head设置为null。你忘了一个标志。在这里,您编写的ifhead=null需要是ifhead==null。newNode是对他创建的新代码的引用。如果这样做,将丢失对分配给新节点的新内存的引用。你应该用第二个参考来指向heaqdWhoops,你是对的。为了投票支持我的三个人,我会解决这个问题!newNode是对他创建的新代码的引用。如果你这样做
这样会丢失对分配给新节点的新内存的引用。你应该用第二个参考来指向heaqdWhoops,你是对的。为了投票支持我的三个人,我会解决这个问题!