2014-05-08 3 views

Répondre

2

Dans une liste à double liaison, l'invariant est que chaque nœud est le prédécesseur de son successeur.

Considérons une implémentation dans laquelle chaque noeud gère deux pointeurs, un pointeur succ pointant vers son noeud successeur et un pointeur pred pointant vers son noeud précédent.

Dans une liste correcte, les pointeurs sont pondus comme ceci:

doubly linked list with 3 nodes

Notez que lorsque vous suivez le pointeur succ d'un nœud à l'autre, vous pouvez toujours utiliser le pointeur pred aller Retour à votre noeud d'origine. Chaque opération manipulant la liste doit s'assurer que cette condition reste intacte.

Une liste qui ne respecte pas cet invariant pourrait ressembler à ceci:

doubly linked list with broken invariant

Cela pourrait par exemple se produire si une opération d'insertion correctement mis en œuvre a essayé d'insérer un nœud n2 au milieu de la liste, mais il a oublié pour mettre à jour le pointeur pred de .

Vérification de cet invariant est simple: parcourir la liste en traversant le long des succ pointeurs (O(n)) et maintenir le dernier noeud visité dans un tampon de mémoire (O(1)). Ensuite, vérifiez à chaque nœud si le pointeur pred du nœud actuel pointe vers le dernier nœud visité.

Si vous connaissez également le noeud final de la liste, vérifiez si le dernier noeud auquel vous arrivez (celui qui n'a pas de successeur) est le noeud final attendu.

Notez qu'avec une seule liste chaînée, aucun tel invariant n'existe.

+0

merci pour la réponse, mais le problème que j'ai, c'est que j'ai affaire à une seule liste-liée. Comment puis-je vérifier la cohérence s'il n'y a pas d'invariant pour une seule liste liée? –

+1

@YukiKurokawa Eh bien, que voulez-vous vérifier? Il n'y a pas d'invariant naturel pour la structure de données à liaison unique en tant que telle, donc je suppose qu'il y a une certaine propriété pour le problème spécifique que vous essayez de résoudre qui peut servir d'invariant. Je vous suggère d'ouvrir une nouvelle question, y compris des informations supplémentaires sur le problème concret et de voir si vous pouvez obtenir une réponse plus précise. Mais s'il vous plaît prenez votre temps pour étoffer correctement cette question avant de poster, pour éviter d'obtenir une autre réponse qui ne vous aidera pas. – ComicSansMS