无法将链接列表的最后位置设置为NULL



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

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。

假设一个链表,3 -> 4 -> 6 -> 7 -> 1你必须删除最后一个位置(第5位)的数字,

' root'的类型是' Node '而不是' LinkedList '。在您的代码中,当您到达最后一个位置时,变量' root '将保存数据' 1 '存储位置的地址,例如,

root = @addrlocation

当你赋值时,

root = null

'root'变量不指向任何内容,实际上您将不删除任何内容。这里的关键是你必须将最后一个节点的'next'节点设置为'null'

在上面的链表中,保存数据' 7 '的最后一个节点仍然将' next '节点的地址保存为@addrlocation。因此,对于您提到的特定情况,链表将不会对您的更改产生影响。

你可以引用前面的节点,' previous '来解决这个问题。我已经修改了你的代码并粘贴在下面,

static Node deletesNodebyposition(Node root,int position)
 {
        if(root == null)
            return null;
        Node head = root;
        Node previous = null;
        int x=1;
        while(x < position && root !=null){
            previous = root;
            root = root.next;
            x++;
        }
            previous.next = root.next;
        return head;
    }
语句
root = null;

对链表没有任何影响。它只是在参数位置Node root中存储null,而不是在Node实例变量中存储null。

要删除node对象链表中的一个节点,只能使用诸如root之类的语句。Next = null将从列表中删除一个节点。

详细讨论链表的处理对我来说有点太费力了。找一本关于数据结构的好书,或者阅读Java的链表实现。

我认为你的问题是你对引用传递的语义感到困惑。让我们看一下Node的声明。

Node foo = new Node();

该语句分配一个新的Node对象,并将该对象的内存地址分配给变量foo。注意变量本身不包含对象,而是包含对它的引用。

当你将一个对象传递给一个方法时,你并没有传递对象本身。相反,将为该方法创建一个new引用变量,并将内存地址(在本例中保存在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不受影响。

相关内容

  • 没有找到相关文章

最新更新