Creo que un pequeño ejemplo de código sería una mejor explicación que una discusión teórica.
El siguiente es el código para la eliminación de nodo en una lista doblemente enlazada de nodos donde NULL
se utiliza para marcar el final de la lista y en donde dos punteros first
y last
se utilizan para mantener la dirección del primero y último nodo:
// Using NULL and pointers for first and last
if (n->prev) n->prev->next = n->next;
else first = n->next;
if (n->next) n->next->prev = n->prev;
else last = n->prev;
y este es el mismo código en el lugar hay un nodo ficticio especial para marcar el final de la lista y cuando la dirección del primer nodo de la lista se almacena en el campo del nodo especial y donde next
el último nodo de la lista se almacena en el campo prev
del nodo ficticio especial:
// Using the dummy node
n->prev->next = n->next;
n->next->prev = n->prev;
El mismo tipo de simplificación también está presente para la inserción del nodo; por ejemplo para insertar nodo n
antes nodo x
(que tiene x == NULL
o x == &dummy
significado inserción en última posición) el código sería:
// Using NULL and pointers for first and last
n->next = x;
n->prev = x ? x->prev : last;
if (n->prev) n->prev->next = n;
else first = n;
if (n->next) n->next->prev = n;
else last = n;
y
// Using the dummy node
n->next = x;
n->prev = x->prev;
n->next->prev = n;
n->prev->next = n;
Como se puede ver el enfoque nodo ficticio eliminado una lista doblemente vinculada todos los casos especiales y todos los condicionales.
El siguiente cuadro representa los dos enfoques para la misma lista en la memoria ...
Gracias por el ejemplo, que tiene mucho más sentido ahora. Solo estaba pensando en términos de iteración, así que realmente no vi el beneficio. – spbots
De nada, los centinelas son una forma inteligente de establecer invariantes para sus algoritmos que puede explotar. – ltjax
No me gusta la idea de que 'find()' altere la estructura de datos; por ejemplo, descarta el uso de 'find' de múltiples hilos, incluso si todos ellos son solo elementos de búsqueda. – 6502