【问题标题】:Not able to set last location of linklist as NULL无法将链接列表的最后位置设置为 NULL
【发布时间】:2016-10-16 18:41:07
【问题描述】:

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

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。但是当我从函数返回并打印我的结果列表时,我仍然找到了最后一个节点。我无法理解为什么最后一个节点无法设置为 NULL。

【问题讨论】:

  • 请包含调用该方法的代码

标签: java data-structures linked-list


【解决方案1】:

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

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

root = @addrlocation

当你分配时,

root = null

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

在上面的链表中,最后一个节点保存数据'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;
    }

【讨论】:

    【解决方案2】:

    声明

    root = null;
    

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

    要删除 Node 对象的链表中的一个节点,只有 root.next = null 之类的语句会从链表中删除一个节点。

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

    【讨论】:

      【解决方案3】:

      我认为您的问题是您对按引用传递的语义感到困惑。让我们看一下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 不受影响。

      【讨论】:

        猜你喜欢
        • 2019-12-22
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 2015-08-06
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 2014-08-25
        相关资源
        最近更新 更多