Comme la plupart de ces réponses ne reçoivent pas vraiment au fond de la question, mais simplement l'intention, peut-être cela vous aidera:
Pour autant que je peux dire la seule différence entre une liste, et une circulaire Linked List est le comportement des itérateurs à la fin ou au début d'une liste. Un moyen très simple de prendre en charge le comportement d'une liste circulaire est d'écrire une méthode d'extension pour un LinkedListNode qui renvoie le nœud suivant dans la liste ou le premier si aucun nœud n'existe, et de même pour récupérer le nœud précédent ou le dernier un si ce noeud n'existe pas. Le code suivant doit accomplir, même si je ne l'ai pas testé:
static class CircularLinkedList {
public static LinkedListNode<T> NextOrFirst<T>(this LinkedListNode<T> current)
{
return current.Next ?? current.List.First;
}
public static LinkedListNode<T> PreviousOrLast<T>(this LinkedListNode<T> current)
{
return current.Previous ?? current.List.Last;
}
}
Maintenant, vous pouvez simplement appeler myNode.NextOrFirst() au lieu de myNode.Ensuite, vous aurez tout le comportement d'une liste circulaire liée. Vous pouvez toujours effectuer des suppressions de temps constant et insérer avant et après tous les nœuds de la liste et autres. S'il y a un autre élément clé d'une liste chaînée circulaire qui me manque, faites le moi savoir.
C'est juste un homme parfait, merci! Pour un style amélioré, on pourrait utiliser le '??' opérateur: return current.Next ?? current.List.First; – Julien
@Julien Les complexités de la langue ne facilitent pas nécessairement la lisibilité. –
Il est important de noter ici que 'current.List' peut potentiellement être nul si le noeud lui-même est dissocié. Voir https://msdn.microsoft.com/en-us/library/h339c45b(v=vs.110).aspx –