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