Antonello
Antonello

Reputation: 1376

LinkedList<T> (2.0): removing items iteratively

I need to iterate through a LinkedList<T> (in .NET 2.0) and remove all the items according to a given criteria. It was easy way under Java, since I could do the following:

Iterator<E> i = list.iterator();
while (i.hasNext()) {
    E e = i.next();
    if (e == x) {
        // Found, so move it to the front,
        i.remove();
        list.addFirst(x);
        // Return it
        return x;
    }
}

Unfortunately, in the .NET behavior of IEnumerator<T> (the equivalent of Iterator<E>) there's no remove method to remove the current element from the collection. Also, in the LinkedList<T> there's no way to access an element at a given index, to accomplish the task by iterating back from the last to the first.

Have you got any idea on how to do it? Thank you very much!

Upvotes: 6

Views: 4983

Answers (4)

bruno conde
bruno conde

Reputation: 48265

Just a little addition to Reed Copsey's answer with a predicate:

    public static T MoveAheadAndReturn<T>(LinkedList<T> ll, Predicate<T> pred)
    {
        if (ll == null)
            throw new ArgumentNullException("ll");
        if (pred == null)
            throw new ArgumentNullException("pred");


        LinkedListNode<T> node = ll.First;
        T value = default(T);

        while (node != null)
        {
            value = node.Value;
            if (pred(value))
            {
                ll.Remove(node);
                ll.AddFirst(node);
                break;
            }
            node = node.Next;
        }

        return value;
    }

Upvotes: 1

Reed Copsey
Reed Copsey

Reputation: 564441

This will remove all nodes that match a criteria, in one loop through the linked list.

LinkedListNode<E> node = list.First;

while (node != null)
{
    var next = node.Next;
    if (node.Value == x) {
        list.Remove(e);
    }
    node = next;
}

I believe that's what you're attempting... You also added back in the node at the beginning of the list (so your java code didn't remove all of the nodes, but rather moved the first matching to the beginning of the list). That would be easy to do with this approach, as well.

Upvotes: 14

Shane Courtrille
Shane Courtrille

Reputation: 14097

One ugly option is to iterate through your list, find all the items that apply and store them in a list. Then iterate through your second list and call remove on your LinkedList...

I'm hoping someone else has a more elegant solution :)

Upvotes: 1

Kris Erickson
Kris Erickson

Reputation: 33834

It's actually a lot easier in C#.

function PlaceAtHead(<T> x)
{
   list.Remove(x);
   list.AddFirst(x);
   return x;
}

Upvotes: 1

Related Questions