После удаления узла в связанном списке печать списка узлов показывает удаленный узел
В приведенном ниже коде, даже после удаления узла (20), если я попытаюсь напечатать все узлы, передав удаленный узел как скрытую головку, он печатает все узлы вместе с удаленным узлом. Кто-нибудь может объяснить это поведение вместе со сборкой мусора на Java? Как он смог перебрать все узлы, даже если нет следующего элемента для удаленного узла (20)?
Узел:
class Node{
int nodeint;
Node next;
public Node(int nodeint){
this.nodeint = nodeint;
}
}
Список ссылок:
public class linkedlist{
Node head;
//Node next;
public linkedlist(Node obj){
this.head = obj;
}
public Node addnodes(int news){
Node newlink = new Node(news);
newlink.next = head;
head = newlink;
return head;
}
public void printAllNodes(Node obj){
Node current = obj;
while(current!=null){
System.out.println(current.nodeint);
current = current.next;
}
}
public Node remove(){
Node temp = head;
head = head.next;
return temp;
}
public void printHead(){
System.out.println("This is the present head node"+head.nodeint);
}
public static void main(String [] args){
Node obj1 = new Node(2);
Node obj2 = new Node(3);
Node obj3 = new Node(4);
obj1.next = obj2;
obj2.next = obj3;
obj3.next = null;
linkedlist newobj = new linkedlist(obj1);
Node obj = null;
obj = newobj.addnodes(5);
obj =newobj.addnodes(20);
//System.out.println(obj.nodeint);
newobj.printAllNodes(obj);
obj = newobj.remove();
System.out.println("A node is deleted");
newobj.printAllNodes(obj);
newobj.printHead();
}
}
Вывод этого кода:
20
5
2
3
4
Узел удаляется
20
5
2
3
4
Это настоящий головной узел: 5
5 ответов:
Узел 20 все еще имеет ссылку на следующий узел, то есть узел 5 в этом случае. Это не связано со сбором мусора. Если вы хотите, чтобы это поведение установило темп.далее = = null в вашем методе remove.
Сначала вы сохраняете зависимость внутри головного узла, затем назначаете новую головку в списке, но назначенная зависимость в старой головке остается такой, какой она была. Также метод remove() возвращает старую головку. А потом вы печатаете все узлы, которые находятся в состоянии старой головы. Также я хотел бы признать, что ваш класс выглядит очень странно. Я не понимаю, почему внутренние зависимости проявляются во внешнем мире. Вам определенно нужно найти исходный код LinkedList из Java libruary
В
printAllNodes()
, вместо передачи узла, сделайте этоpublic void printAllNodes() { Node current = head; while (current != null) { System.out.println(current.nodeint); current = current.next; } }
И на
remove()
, вернуть новый головной узел вместо удаленного узла,public Node remove(){ Node temp = head; head = head.next; temp.next = null; //removing link to next node return head; //returning head. Not deleted node }
Пояснение: ваша функция
remove()
удаляет head из связанного списка, который вы вызываете, но также возвращает удаленную головку, и эта прежняя головка все еще имеет свое свойствоnext
, указывающее на следующий узел (который является текущей головкой).Когда вы вызывали
newobj.printAllNodes(obj);
, вы передали возвращенный прежний head в качестве параметра.Решение 1: вы могли бы назвать это как
newobj.printAllNodes(newobj.head);
Решение 2: Сделайте то, что предложил @hege_hegedus
Ваш код работает. Вид:
This is the present head node: 5
Список все еще печатает 20, потому что
linkedlist.printAllNodes
печатает список, начинающийся с параметра, а не с его головы. Измените свой метод:public void printAllNodes() { Node current = head; while (current != null) { System.out.println(current.nodeint); current = current.next; } }
И измените вызовы:
newobj.printAllNodes(); // invoke without parameter