Soy un principiante en la codificación y recientemente estudié la lista vinculada en JavaScript.
Estoy confundido de que al eliminar el nodo, ¿también debo cambiar el puntero del nodo de eliminación a null ?
El método RemoveAt(index) es un método personalizado para eliminar el nodo en un índice específico.
Ejemplo de la siguiente manera:
// 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--; }La mayoría de los ejemplos de listas vinculadas que vi en JS omitieron esto. Me pregunto si desperdiciará más memoria.
No es necesario que asigne null a current . Es una variable que es local a la función, por lo que tan pronto como la función finaliza, no hay más referencias al nodo eliminado y se puede recolectar basura.
Si fuera del contexto de la función, tiene otra referencia al nodo que se elimina, entonces el nodo no se recolectará como basura. Asignar null a current no cambiará esa situación.
Sin embargo, algunos codificadores pueden querer aislar el nodo:
current.next = null; De esta forma, si en algún lugar todavía hay una referencia a ese nodo, no hay riesgo de pasar de ese nodo a la lista, lo que puede no ser deseado. Por otro lado, realmente es un olor de código si fuera de la función todavía hay una referencia al nodo que se elimina, y se volvería realmente maloliente si esa referencia todavía se usa para atravesar su next propiedad. Entonces, si el código general está haciendo lo correcto, tampoco necesita hacer current.next = null .
... mientras elimino el nodo, ¿también debo cambiar el puntero del nodo eliminado a
null? ... Me pregunto si desperdiciará más memoria.
No es necesario para la gestión de la memoria, no. (Creo que hay un argumento para hacerlo por otras razones, pero no por la administración de la memoria). Si elimina el nodo A sin borrar su puntero al nodo B, y nada más se refiere al nodo A, entonces es elegible para recolección de basura. (Y si también elimina B, el hecho de que A todavía se refiera a él no lo mantendrá en la memoria si nada más tiene una referencia a ellos; ambos serán elegibles para la recolección de basura).
No es necesario hacer eso, ya que está liberando esa parte de la memoria al eliminar el nodo, no importa cuál sea el contenido de la parte de datos de ese nodo liberado o la siguiente parte