【问题标题】:linked list replacing and deleting链表替换和删除
【发布时间】:2020-01-06 19:56:13
【问题描述】:

我想从链表中删除节点,只给出要删除的节点。 这是函数:

function deleteNode(node) {
  if (!node.next)throw new Error()
  node.value = node.next.value
  node.next=node.next.next
}

我的问题是为什么我不能这样做?我知道它不起作用,但为什么呢?

function deleteNode(node) {
  if (!node.next)throw new Error()
  node = node.next
}

【问题讨论】:

    标签: javascript linked-list


    【解决方案1】:

    有一个由 3 个节点组成的链先前 -> 当前(要删除)-> 下一个。

    函数中的node是对要删除的节点对象的引用。对实际节点的另一个引用是来自前一个节点的引用。要删除一个节点,您需要删除前一个节点对它的引用。

    node 重新分配给node.next 只会替换存储在临时node 参数中的引用,但不会更改前一个或当前节点。

    本例中的代码通过将其内容替换为下一个节点的内容来“删除”一个节点。由于删除了对下一个节点的引用,因此实际上将从列表中删除下一个节点(如果没有其他引用,则会收集垃圾)。但是,价值将保持不变。这不是当前节点的实际删除(原始对象仍然存在)。

    如果你想删除实际的节点对象,而不是替换它的内容,你需要遍历链表。当您到达前一个节点(具有next 属性的节点指向您要删除的节点)时,将其next 属性更改为已删除的节点next 属性。

    【讨论】:

    • 您说我只会替换存储在临时节点中的引用,但是节点是如何临时的?此外,如果它是临时的,那么不会改变它的值并且 next 也是临时的吗?
    • 这不是一个临时节点,它是一个名为node 的临时变量,它引用了一个对象。当您替换 node 变量包含的内容时,您不会更改实际对象。设置 node = 5 不会将实际节点转换为 5。
    猜你喜欢
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多