removeAt() 函数是否应该删除删除节点的指针?

Should the removeAt() function remove the removing node’s pointer?

我是编码初学者,最近在 JavaScript 上学习链表。

我很困惑,在删除节点的同时,我是否也应该将删除节点的指针更改为null

RemoveAt(index) 方法是一种自定义方法,用于删除特定索引处的节点。

示例如下:

// remove node 
removeAt(index){
    // check if index is qualified
    if(index < 0 || index > this.length) return null;
    let current = this.head,
        prev = null,
        idx = 0;
    // if first node
    if(index===0){
        // point the head to next node
        this.head = current.next;
    }else{
        // else find the index
        while(idx++ < index){
            prev = current; // set prev node as current
            current = current.next; // and move current to the next node
        }
        // index finded, link prev.next & current.next
        prev.next = current.next;
    }
    this.length--;
}

我在JS中看到的大部分链表例子都省略了这个。我想知道它会不会浪费更多的内存?

...while removing node, should I also change the removed node’s pointer to null? ... I am wondering will it waste more memory?

不需要内存管理,不需要。 (我认为这样做是出于其他原因,而不是内存管理。)如果您删除节点 A 而没有清除其指向节点 B 的指针,并且没有其他任何内容指向节点 A,那么它就有资格进行垃圾收集。 (如果您还删除了 B,那么 A 仍然引用它的事实将不会保留在内存中,如果没有其他任何东西引用它们的话;它们都将有资格进行垃圾回收。)

没有必要这样做,因为您是通过删除节点来释放那部分内存,所以释放节点的数据部分或下一部分的内容是什么并不重要

您不需要将 null 分配给 current。它是函数局部的变量,所以一旦函数退出,就不再有对被移除节点的引用,可以被垃圾回收。

如果在函数上下文之外您碰巧有另一个对已删除节点的引用,则该节点将不会被垃圾回收。将 null 分配给 current 不会改变这种情况。

一些编码人员可能想要 隔离 节点但是:

current.next = null;

这样,如果某处仍然有对该节点的引用,则不存在从该节点进入列表的风险,这可能是不希望的。另一方面,如果在函数外部仍然存在对已删除节点的引用,这确实是一种代码味道,如果该引用仍用于遍历其 next 属性。因此,如果整个代码都在做正确的事情,那么您实际上也不需要做 current.next = null