删除链表中的节点后,打印节点列表显示已删除节点
Posted
技术标签:
【中文标题】删除链表中的节点后,打印节点列表显示已删除节点【英文标题】: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
【问题讨论】:
谢谢大家,所有的答案都帮助我理解了这个概念。我只是在尝试通过多种方式调整链接列表。 【参考方案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
【讨论】:
以上是关于删除链表中的节点后,打印节点列表显示已删除节点的主要内容,如果未能解决你的问题,请参考以下文章