Добавление в конец пользовательского связанного списка приводит к появлению NPE в «newNode.data = ..»

1

Привет, кто-нибудь может помочь мне с проблемой 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, а затем я добираюсь до конца. Я вставляю newNode, содержащий OBJ

Текущий код генерирует ошибку исключения нулевой точки в этой части: newNode.data=obj; ,

Почему он не работает? Цените любую помощь, спасибо!

  • 3
    Как вы собираетесь делать newNode.data, если newNode имеет значение null?
  • 2
    Если newNode==null имеет значение true тогда вы пытаетесь получить доступ к данным узла. Поскольку узел имеет значение null, нет данных для доступа, поэтому вы получите исключение.
Показать ещё 1 комментарий
Теги:
linked-list
nullpointerexception

5 ответов

1
Лучший ответ

Прежде всего, если вы используете свой головной узел для начала, вам не нужно создавать узел до этого. Во-вторых, пока вы повторяете свою структуру, вы слишком далеко прыгаете на один шаг.

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 neighbor
        newNode.link = temp;
    }
}
  • 0
    Вы должны обрабатывать, если head null для начала.
  • 0
    Ах да, ты прав. Не думал об этом. Я буду редактировать пост.
Показать ещё 1 комментарий
3
if( head == null )
{
     //add to head
     ...
}
else
{
    //traverse the list
    for( Node tail = head;  tail.link != null;  tail = tail.link )
       ;

    //add to tail
    ...
}
  • 0
    newNode был ссылкой на новый код, который он создал. Если вы поступите таким образом, вы потеряете ссылку на новую память, назначенную новому узлу. Вы должны использовать 2-ю ссылку, чтобы указать на heaqd
  • 0
    Упс, вы правы. Я исправлю это ради 3 человек, которые проголосовали против меня!
0

Решение моего ответа я теперь, кажется, работает так, как хочу, каждый раз, когда я вызываю экземпляр 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; 

}

Всем спасибо!

0

Условием будет

while(newNode.link != null)

и инициализировать перед помещением в данные

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

Вы проверяете, имеет ли значение 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
  • 0
    Это не относится к случаю, когда head равна null . @Dean Duff curr = head , а не newNode . newNode будет добавлен в конец списка.
  • 0
    Я добавил это. Плюс его вопрос был как добавить в конце
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню