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



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

节点20仍然引用下一个节点,即本例中的节点5。它与垃圾收集无关。如果您希望该行为,请在remove方法中设置temp.next==null

首先在head节点中存储依赖项,然后在列表中分配新的head,但在旧head中分配的依赖项保持原样。同样remove()方法返回旧的头。然后打印所有节点,从旧头开始统计。我还想承认,你们班看起来很难看。我不明白为什么内部依赖关系显示在外部世界。您需要从Java libruary 中发现LinkedList的源代码

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,但也返回已删除的head,并且前一个head的next属性仍然指向下一个节点(即当前head)。

当您调用newobj.printAllNodes(obj);时,您将返回的前一个头作为参数进行传递。

解决方案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

相关内容

  • 没有找到相关文章

最新更新