2010-02-28 12 views

Odpowiedz

1

Z pewnością (z połączoną listą) musisz zmienić link.

Np, jeżeli chcesz usunąć B z LL ABC, trzeba zmienić w link B do C.

Muszę przyznać, że nie jestem zaznajomiony z wdrażaniem .NET połączonych listach, ale mam nadzieję, że to dla ciebie początek.

+2

porządku, myślę, że mam zrobić myCollection.Remove (it.Value) zamiast. –

+0

zmienili moje imię: możesz po prostu zrobić myCollection.Remove (it) - Remove ma przeciążenie, które ma 'LinkedListNode ' - nie musisz wyciągać wartości. – itowlson

+0

Ucieczka do takiej kolekcji wydaje się wymagać dużego nakładu zasobów. Jeśli wiesz, że sekwencja logiki węzłów sugeruje, że możesz to zrobić bardziej efektywnie, mówiąc poprzedniemu węzłowi, aby zmienił swój węzeł na następny węzeł bieżącego węzła. Powiedz to dziesięć razy szybko. – Oli

1

Zmieniasz wartość wskazywaną przez LinkedListNode; uważaj, że twoja lista będzie zawierała teraz otwór (pusty węzeł).

Zamiast A - B - C będziesz mieć A - null - C, jeśli "usuniesz" B. Czy to właśnie chcesz osiągnąć?

0

zakładam coś takiego jest wymagane

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

Nie skompiluje: Next i Previous są tylko do odczytu. Po prostu użyj opcji Usuń. – itowlson

0

Jeśli można konwertować do korzystania Lista <> zamiast LinkedList <> następnie można użyć removeAll() operacji. Przeprowadź anonimowego delegata w ten sposób;

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

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

Wszystko to używa rozszerzeń Linq.

Jeśli nie można przekonwertować na listę, można użyć metody ToList <>(), aby ją przekonwertować. Będziesz jednak musiał wykonać pewne jasne operacje wstawiania. Lubię to;

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)); 

Jeśli to wszystko nadal nie jest smaczne, spróbuj wykonać kopię listy typu LinkedList w ten sposób;

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); 
    } 
} 

Mam nadzieję, że to pomaga.

0

O ile zrozumiałem, chcesz iteracyjne w LinkedList z cyklu dla których olso zawiera zerowe -s, dzięki czemu można używać folowing:

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

} 
+0

Daje pustą referencję, gdy "a" jest puste. – Gerard

+0

@Gerard Musisz to sprawdzić przed wprowadzeniem pętli –

+0

Może poprawisz swoją odpowiedź, aby uwzględnić ten ważny szczegół. Alternatywnie możesz zrobić: 'dla (LinkedListNode node = a.First; a.Last! = Null && node! = A.Last.Next; node = node.Next)' – Gerard

6

Ustawianie it.Value null nie usunie węzeł z listy Oto jeden sposób:

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; 
    } 
Powiązane problemy