2010-02-28 14 views

Respuesta

1

Seguramente (con una lista vinculada) debe cambiar el enlace.

Por ejemplo, si desea eliminar B de la LL ABC, tiene que cambiar el enlace de A a B a C

voy a admitir que no estoy familiarizado con la implementación .NET de listas enlazadas, pero espero que sea un comienzo para ti.

+2

derecha, creo que tengo que hacer un myCollection.Remove (it.Value) en su lugar. –

+0

cambiaron mi nombre: simplemente puede hacer una myCollection.Remove (it) - Remove tiene una sobrecarga que toma un 'LinkedListNode ' - no necesita extraer el valor. – itowlson

+0

Correr hacia la colección parece un poco intensivo de recursos. Si sabe que la secuencia de nodos lógica sugiere que podría hacer esto de manera más eficiente al decirle al nodo anterior que cambie su nodo al siguiente nodo del nodo actual. Di eso diez veces rápido. – Oli

1

Está cambiando el valor apuntado por LinkedListNode; tenga en cuenta que su lista contendrá un agujero (nodo vacío) ahora.

En lugar de A - B - C va a tener A - null - C, si "elimina" B. ¿Es eso lo que quieres lograr?

0

asumo algo como esto se requiere

for (LinkedListNode<MyClass> it = myCollection.First; it != null; it = it.Next) { 
    if (it.Value.removalCondition == true) { 
    if (it.Previous != null && it.Next != null) { 
     it.Next.Previous = it.Previous; 
     it.Previous.Next = it.Next; 
    } else if (it.Previous != null) 
     it.Previous.Next = it.Next; 
    } else if (it.Next != null) 
     it.Next.Previous = it.Previous; 
    it.Value = null; 
    } 
} 
+0

No compila: Next y Previous son de solo lectura. Solo usa Eliminar en su lugar. – itowlson

0

Si usted puede convertir a la utilización de la lista <> en lugar de ListaEnlazada <> continuación, puede utilizar la operación RemoveAll(). Pase un delegado anónimo como este;

List<string> list = new List<string>() 
{ 
    "Fred","Joe","John" 
}; 

list.RemoveAll((string val) => 
{ 
    return (0 == val.CompareTo("Fred")); 
}); 

Todo esto está utilizando extensiones Linq.

Si no puede convertir a una lista, puede usar el método ToList <>() para convertirlo. Pero luego tendrá que hacer algunas operaciones claras y de inserción. Me gusta esto;

LinkedList<string> str = new LinkedList<string>(); 
str.AddLast("Fred"); 
str.AddLast("Joe"); 
str.AddLast("John"); 

List<string> ls = str.ToList(); 
ls.RemoveAll((string val) => val.CompareTo("Fred") == 0); 
str.Clear(); 
ls.ForEach((string val) => str.AddLast(val)); 

Si todo esto todavía no es apetecible, intente hacer una copia de la LinkedList de esta manera;

LinkedList<string> str = new LinkedList<string>(); 
str.AddLast("Fred"); 
str.AddLast("Joe"); 
str.AddLast("John"); 

LinkedList<string> strCopy = new LinkedList<string>(str); 
str.Clear(); 
foreach (var val in strCopy) 
{ 
    if (0 != val.CompareTo("Fred")) 
    { 
     str.AddLast(val); 
    } 
} 

Espero que ayude.

0

Por lo que he entendido ¿Quieres recorrer en LinkedList por ciclo que contiene olso -s nulos, lo que puede utilizar folowing:

for (LinkedListNode<string> node = a.First; node != a.Last.Next; node = node.Next) 
{ 
       // do something here 

} 
+0

Esto da referencias nulas cuando 'a' está vacío. – Gerard

+0

@Gerard Debe verificarlo antes de ingresar al bucle –

+0

Quizás modifique su respuesta para incluir ese detalle sobresaliente. Alternativamente, puede hacer: 'para (LinkedListNode node = a.First; a.Last! = Null && node! = A.Last.Next; node = node.Next)' – Gerard

6

Ajuste del it.Value a null no eliminará el nodo de la lista Aquí es una manera:

for(LinkedListNode<MyClass> it = myCollection.First; it != null;) 
    { 
     LinkedListNode<MyClass> next = it.Next; 
     if(it.Value.removalCondition == true) 
       myCollection.Remove(it); // as a side effect it.Next == null 

     it = next; 
    } 
Cuestiones relacionadas