После удаления узла в связанном списке печать списка узлов показывает удаленный узел


В приведенном ниже коде, даже после удаления узла (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 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