Je pense qu'un petit exemple de code serait une meilleure explication que d'une théorie de la discussion.
Voici le code pour le nœud de suppression dans une liste à double liaison de nœuds où NULL
est utilisé pour marquer la fin de la liste et où les deux pointeurs first
et last
sont utilisés pour contenir l'adresse de la première et de la dernière nœud:
// 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;
et c'est le même code, où au lieu de cela, il existe un mannequin nœud pour marquer la fin de la liste et lorsque l'adresse du premier nœud de la liste est stockée dans l' next
domaine du nœud spécial et où le dernier nœud de la liste est stockée dans l' prev
domaine de la spéciale mannequin nœud:
// Using the dummy node
n->prev->next = n->next;
n->next->prev = n->prev;
Le même genre de simplification est également présent pour le nœud d'insertion; par exemple, pour insérer un nœud n
avant que le nœud x
(ayant x == NULL
ou x == &dummy
sens d'insertion en dernière position), le code serait:
// 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;
et
// Using the dummy node
n->next = x;
n->prev = x->prev;
n->next->prev = n;
n->prev->next = n;
Comme vous pouvez le voir le mannequin nœud approche supprimé pour un doublement lié liste de tous les cas particuliers et à toutes les conditions.
La photo suivante représente les deux approches pour la même liste en mémoire...