2009-06-22 6 views
14

Necesito una lista circular vinculada, por lo que me pregunto si LinkedList es una lista circular vinculada?¿LinkedList en .NET es una lista circular vinculada?

+0

@ John, FYI leer los documentos, pero si usted sabía nada, que se sabe que esto es una pregunta válida, teniendo en cuenta Las implementaciones de LinkedList varían mucho. –

+0

Bien, retiraré el -1 hasta que especifique a qué se refiere con una lista circular circular y por qué la documentación de MSDN no lo dejó en claro. De esa forma, también le diremos a Microsoft cómo arreglar la documentación. –

+0

Bastante justo. Creo que realmente no confiaba si MS usaba el término correctamente. Sabes que a veces los reclamos por el BCL no son válidos. Menor, pero aún quería estar seguro. –

Respuesta

14

No. Es una lista doblemente vinculada, pero no una lista circular vinculada. Ver MSDN for details on this.

LinkedList <T> hace una buena base para su propia lista circular vinculada, sin embargo. Pero sí tiene una propiedad definida Primero y Último, y no enumerará alrededor de estos, lo que hará una lista circular apropiada.

4

No, no lo es.

+1

Primero sí, ahora no .... confundes doblemente con circular. – leppie

+0

¡Sí! Lo siento. Corregido ahora. –

47

Una solución rápida para usarlo en forma circular, cada vez que desee mover el "siguiente" pieza en la lista:

current = current.Next ?? current.List.First; 

donde la corriente es LinkedListNode<T>.

+5

Esto es astuto. Me gusta. –

3

Mientras que la API pública de LinkedList no es circular, internamente lo es. Consulta al reference source, se puede ver cómo se implementa:

// This LinkedList is a doubly-Linked circular list. 
internal LinkedListNode<T> head; 

Por supuesto, para ocultar el hecho de que es circular, propiedades y métodos que atraviesan la lista hacer comprobaciones para evitar envolver de nuevo a la cabeza.

LinkedListNode:

public LinkedListNode<T> Next { 
    get { return next == null || next == list.head? null: next;} 
} 

public LinkedListNode<T> Previous { 
    get { return prev == null || this == list.head? null: prev;} 
} 

LinkedList.Enumerator:

public bool MoveNext() { 
    if (version != list.version) { 
     throw new InvalidOperationException(SR.GetString(SR.InvalidOperation_EnumFailedVersion)); 
    } 

    if (node == null) { 
     index = list.Count + 1; 
     return false; 
    } 

    ++index; 
    current = node.item; 
    node = node.next; 
    if (node == list.head) { 
     node = null; 
    } 
    return true; 
} 
+0

Sé que esta pregunta es antigua, pero dado que el código abierto de .NET es bastante reciente, creo que es bueno saber qué está sucediendo bajo el capó. –

Cuestiones relacionadas