【问题标题】:After deleting node in linked list, printing the node list is showing deleted node删除链表中的节点后,打印节点列表显示已删除节点
【发布时间】:2016-03-31 15:46:12
【问题描述】:

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

【问题讨论】:

  • 谢谢大家,所有的答案都帮助我理解了这个概念。我只是在尝试通过多种方式调整链接列表。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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
      }
      

      【讨论】:

        【解决方案4】:

        解释:你的remove() 函数从你调用它的链表中删除了头,但也返回了被删除的头,这个前头仍然有它的next 属性指向下一个节点(这是当前头) .

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

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

        解决方案 2:按照@hege_hegedus 的建议进行操作

        【讨论】:

          【解决方案5】:

          您的代码有效。看:

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多