我想从链表中删除节点,只给出要删除的节点。 这是函数:
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
}
有一个由3 个节点组成的链 前一个 -> 当前(删除(->下一个。
函数中的node
引用要删除的节点对象。对实际节点的另一个引用是来自前一个节点的引用。要删除节点,您需要删除对前一个节点的引用。
将node
重新分配给node.next
只会替换存储在临时node
参数中的引用,但不会更改上一个或当前节点。
在这种情况下,代码通过将节点的内容替换为下一个节点的内容来"删除"节点。由于删除了对下一个节点的引用,因此下一个节点实际上将从列表中删除(如果没有其他引用,则进行垃圾回收(。但是,该值将保留。这不是当前节点的实际删除(原始对象仍然存在(。
如果要删除实际的节点对象,而不是替换其内容,则需要遍历链表。当您到达上一个节点(具有指向要删除的节点的next
属性的节点(时,将其next
属性更改为已删除的节点next
属性。