删除链表中的节点后,打印节点列表显示删除的节点
After deleting node in linked list, printing the node list is showing deleted node
在下面的代码中,即使在删除节点 (20) 之后,如果我尝试通过将已删除的节点伪装为 head 来打印所有节点,它也会打印所有节点以及已删除的节点。有人可以在 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
A node is deleted
20
5
2
3
4
This is the present head node: 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
首先将依赖存储在头节点中,然后在列表中分配新头,但旧头中分配的依赖保持原样。还有 remove() 方法 return 旧头。然后你从旧头打印所有节点。
另外我想承认,你 class 看起来很奇怪。我不明白为什么在外部世界中显示内部依赖关系。您非常需要从 Java 库
中发现 LinkedList 的源代码
在printAllNodes()
中,不是传递节点,而是这样做
public void printAllNodes() {
Node current = head;
while (current != null) {
System.out.println(current.nodeint);
current = current.next;
}
}
并且在 remove()
上,return 新的头节点而不是删除的节点,
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,而且 returns 已删除的 head 并且这个以前的 head 仍然有它的 next
属性指向下一个节点(也就是当前的head)。
当您调用newobj.printAllNodes(obj);
时,您传递了返回的前头作为参数。
解决方案 1:您可以将其称为 newobj.printAllNodes(newobj.head);
解决方案 2:执行 @hege_hegedus 建议的操作
节点 20 仍然引用下一个节点,即本例中的节点 5。它与垃圾收集无关。如果你想要那种行为 set temp.next == null 在你的 remove 方法中。
在下面的代码中,即使在删除节点 (20) 之后,如果我尝试通过将已删除的节点伪装为 head 来打印所有节点,它也会打印所有节点以及已删除的节点。有人可以在 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
A node is deleted
20
5
2
3
4
This is the present head node: 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
首先将依赖存储在头节点中,然后在列表中分配新头,但旧头中分配的依赖保持原样。还有 remove() 方法 return 旧头。然后你从旧头打印所有节点。 另外我想承认,你 class 看起来很奇怪。我不明白为什么在外部世界中显示内部依赖关系。您非常需要从 Java 库
中发现 LinkedList 的源代码在printAllNodes()
中,不是传递节点,而是这样做
public void printAllNodes() {
Node current = head;
while (current != null) {
System.out.println(current.nodeint);
current = current.next;
}
}
并且在 remove()
上,return 新的头节点而不是删除的节点,
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,而且 returns 已删除的 head 并且这个以前的 head 仍然有它的 next
属性指向下一个节点(也就是当前的head)。
当您调用newobj.printAllNodes(obj);
时,您传递了返回的前头作为参数。
解决方案 1:您可以将其称为 newobj.printAllNodes(newobj.head);
解决方案 2:执行 @hege_hegedus 建议的操作
节点 20 仍然引用下一个节点,即本例中的节点 5。它与垃圾收集无关。如果你想要那种行为 set temp.next == null 在你的 remove 方法中。