Привет, кто-нибудь может помочь мне с проблемой 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;
,
Почему он не работает? Цените любую помощь, спасибо!
Прежде всего, если вы используете свой головной узел для начала, вам не нужно создавать узел до этого. Во-вторых, пока вы повторяете свою структуру, вы слишком далеко прыгаете на один шаг.
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;
}
}
head
null
для начала.
if( head == null )
{
//add to head
...
}
else
{
//traverse the list
for( Node tail = head; tail.link != null; tail = tail.link )
;
//add to tail
...
}
Решение моего ответа я теперь, кажется, работает так, как хочу, каждый раз, когда я вызываю экземпляр 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;
}
Всем спасибо!
Условием будет
while(newNode.link != null)
и инициализировать перед помещением в данные
newNode.link = new ListNode();
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
head
равна null
. @Dean Duff curr = head
, а не newNode
. newNode будет добавлен в конец списка.
newNode==null
имеет значениеtrue
тогда вы пытаетесь получить доступ к данным узла. Поскольку узел имеет значение null, нет данных для доступа, поэтому вы получите исключение.