我编写了从链接列表中删除某个位置的节点的代码。
static Node deletesNodebyposition(Node root,int position)
{
if(root == null)
return null;
Node head = root;
int x=1;
while(x < position && root !=null){
root = root.next;
x++;
}
if(root.next !=null) {
root.data = root.next.data;
root.next = root.next.next;
}
else
root = null;
return head;
}
在我选择要删除的最后一个节点之前,代码可以正常工作。输入删除节点的最后一个位置时,我正在尝试将节点设置为NULL。但是当我从函数返回并打印结果列表时,我仍然找到了最后一个Node。我不明白为什么最后一个节点不能设置为NULL。
最佳答案
我认为您的问题是,您对引用传递的语义感到困惑。让我们看一下Node
的声明。
Node foo = new Node();
该语句分配一个新的
Node
对象,并将该对象的内存地址分配给变量foo
。请注意,变量本身不包含对象,而是对其的引用。当您将对象传递给方法时,并不是在传递对象本身。而是为该方法创建一个新的引用变量,并将内存地址(在这种情况下,保存为
foo
)复制到该变量中。因此,将其与您的方法相关联
static Node deletesNodebyposition(Node root, int position)
{
调用此方法时,将创建
root
,它是一个全新的参考变量。 foo
的值复制到root
中。由于它们都指向相同的内存块,因此您可以执行以下操作root.data = root.next.data;
root.next = root.next.next;
因为您正在使用引用转到先前分配的内存块。但是,声明
root = null;
没有将
foo
设置为null
,而是将root
设置为null
。因此foo
不受影响。