删除链表中的节点后,打印节点列表显示已删除的节点

时间:2015-12-25 19:16:09

标签: java linked-list singly-linked-list

在下面的代码中,即使在删除节点(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 个答案:

答案 0 :(得分:1)

您的代码有效。看:

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

答案 1 :(得分:1)

首先,您将依赖项存储在头节点中,然后在列表中分配新头,但在旧头中分配依赖关系保持不变。另外remove()方法返回旧头。然后从旧头打印所有节点statring。 我也想承认,你上课看起来非常棒。我不明白为什么外部世界会显示内部依赖关系。您不太需要从Java libruary

发现LinkedList的源代码

答案 2 :(得分:1)

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
}

答案 3 :(得分:1)

说明:您的remove()函数从您调用它的链接列表中删除头部,但也返回已删除的头部,此前头仍然具有指向下一个节点的next属性(这是目前的头脑。)

当您致电newobj.printAllNodes(obj);时,您将返回的前头作为参数传递。

解决方案1:您可以将其称为newobj.printAllNodes(newobj.head);

解决方案2:执行@hege_hegedus建议

答案 4 :(得分:1)

在这种情况下,节点20仍然参考下一个节点,即节点5。它与垃圾收集无关。如果您希望删除方法设置temp.next == null