【问题标题】:Linked List - Removing Last Node链表 - 删除最后一个节点
【发布时间】:2016-06-11 22:32:06
【问题描述】:

我正在创建一个函数来删除给定列表的最后一个节点(作为参数输入)。该函数本身非常简单,如下所示。

function popBack(list) {
    var current = list.head,
        previous;

    while (current.next) {
        previous = current;
        current = current.next;
    }

    // console.log(current);
    // console.log(previous.next);
    // current = null;
    // console.log(current);
    // console.log(previous.next);

    previous.next = null;
    return list;
}

由于列表中的下一个节点被它之前的节点引用,previous.next 和 current 应该指向同一个对象。这让我想到了我的问题。如果我设置current 等于null,那不是previous.next 也等于null 吗?情况似乎并非如此,因为 previous.next 仍然引用 current 曾经的样子。谁能解释一下为什么会这样?

提前致谢。

【问题讨论】:

  • 一个很常见的菜鸟错误是认为两个变量是相同的,当你改变一个时,你就改变了另一个。不过,您说得对:它们都只是指向同一个对象。然后其中一个停止指向。另一个在它的指向性上没有改变。如果你想让两个变量停止指向,你必须分别对它们大喊大叫。
  • 正如 Amadan 所说,您实际上并没有删除对象,只是更改了 .next 引用的内容。
  • 嘿阿马丹,非常感谢您的及时回复。我从您的回复中得到的是,通过设置current = null,它会阻止current 指向previous.next 指向的同一个对象。所以现在current 指向一个没有价值的新内存库。这是正确的吗?
  • 差不多但不完全。 null 是一个原始值:JS 变量 引用 对象(您也可以说“包含对象引用”,尽管您实际上不能像从 C 中那样直接从 JS 中看到它们),但包含原语。因此,“current 指向null”是不正确的; “current 包含null”是。由于包含nullcurrent 不再指向任何地方。

标签: javascript linked-list


【解决方案1】:

previous.nextcurrent 指向同一个对象是对的。我们称该对象为O。也就是说,

  • previous.next 指向O
  • current 指向O

当你运行以下代码时,

current = null;

它不会将 O 设置为 null,它只会更改 current 指向的内容。也就是说,current = null; 运行后,这是新的状态:

  • previous.next 指向O
  • current 指向null

【讨论】:

  • 非常感谢您的快速回复。您的回答加强了我对 Amadan 回复的回应。
猜你喜欢
  • 2013-03-25
  • 2014-05-22
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多