从链接列表中删除

时间:2011-11-19 16:01:57

标签: c# linked-list

根据我提出的previous questionRemoveAll是根据条件从List<>中删除的最简洁方法。很想知道从LinkedList中删除的最佳方法是什么,因为那里没有RemoveAll函数。

List<ItemClass> itemsToErase = new List<ItemClass>();
    foreach(ItemClass itm in DS)
    {
           if(itm.ToBeRemoved)
                itemsToErase .Add(itm);
    }
    foreach(ItemClass eraseItem in itemsToErase)
    {
          DS.Remove(eraseItem );
    }          

编辑:DS的类型为LinkedList<ItemClass>

2 个答案:

答案 0 :(得分:25)

虽然在使用foreach进行迭代时无法从LinkedList<T>删除节点,但您可以按照每个LinkedList<T>Next属性手动迭代LinkedListNode<T> 3}}。在删除节点之前,请记住该节点的下一个节点:

var list = new LinkedList<int>(Enumerable.Range(0, 10));
var node = list.First;
while (node != null)
{
    var next = node.Next;
    if (node.Value % 2 == 0)
        list.Remove(node);
    node = next;
}

扩展方法:

public static int RemoveAll<T>(this LinkedList<T> list, Predicate<T> match)
{
    if (list == null)
    {
        throw new ArgumentNullException("list");
    }
    if (match == null)
    {
        throw new ArgumentNullException("match");
    }
    var count = 0;
    var node = list.First;
    while (node != null)
    {
        var next = node.Next;
        if (match(node.Value))
        {
            list.Remove(node);
            count++;
        }
        node = next;
    }
    return count;
}

用法:

LinkedList<ItemClass> DS = ...
DS.RemoveAll(itm => itm.ToBeRemoved);

另请参阅:Extension Methods (C# Programming Guide)

答案 1 :(得分:0)

System.Collections.Generic.LinkedList<T>中删除项目的唯一方法是使用Remove()方法之一。但是,此操作比删除表单List<T>O(1)而不是O(n))更快,因为操作可以在本地执行。删除项目后面的项目不能移动,只有被删除项目之前和之后的两个节点必须链接在一起。 removed.Previous.Next = removed.Next; removed.Next.Previous = removed.Previous;。这是在内部完成的,因为PreviousNext属性是只读的。