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
。
我是编码初学者,最近在 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
。