我编写了从链接列表中删除某个位置的节点的代码。

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不受影响。

07-24 15:12