从链表中删除C#

时间:2011-10-07 15:50:19

标签: c#

我正在尝试删除一个节点,如果x当前与我的链表中的int匹配。

我尝试了这个,但是一旦删除了节点,就会在检查foreach循环时抛出错误

public void DeleteNode(int x, LinkedList<name> myLinkedList) {
    foreach (name item in myLinkedList) {
         if (item.num.equals(x)) mylinkedList.Remove(x);
    }
}

希望这是有道理的。

6 个答案:

答案 0 :(得分:23)

是的,您不能迭代集合并同时修改它。但是,LinkedList<T>可以让您非常轻松地进行迭代:

public void DeleteNode(int x, LinkedList<name> myLinkedList) {
    var node = myLinkedList.First;
    while (node != null) {
        var nextNode = node.Next;
        if (node.Value.num == x) {
            myLinkedList.Remove(node);
        }
        node = nextNode;
    }
}

请注意,只有将node = node.Next;作为最后一行,您才能逃脱;删除后,节点无效。

这种方法允许在O(n)中单次遍历列表,并且可能是您将找到的最有效的方法。它不需要任何复制,也不需要使用集合(例如List<T>),删除复杂度较低。

答案 1 :(得分:0)

如果您在foreach期间调用remove,则会使枚举器无效,因此不允许这样做。

将您的foreach更改为简单的for循环。

答案 2 :(得分:0)

在这种情况下,我通常会创建一个临时集合,并在需要删除时将其添加到集合中。然后我遍历该列表,将其从原始列表中删除。

答案 3 :(得分:0)

我在不使迭代器失效的情况下编写的方式是:

foreach(var item in list.Where(w=>w.num.Equals(x)).ToArray())
   list.Remove(item);

答案 4 :(得分:0)

我按以下方式从列表中删除项目:

for (int j = lst.Count - 1; j >= 0; j--)
   {
    var elem= lst[j];
    lst.Remove(elem);
    }

它看起来非常接近常规&#34; foreach var elem in lst&#34;,这就是我喜欢的原因。

我从最后到开始,否则您将丢失索引,并需要跟踪已删除项目的数量。

答案 5 :(得分:0)

info 是一个类。

这将通过 linkedlist 查找并删除 no 属性值为 1 的第一项

LinkedList<info> infolist = new LinkedList<info>();

string todelete = "1";

info tmpitem = new info();
foreach (var item in infolist)
{
    if (item.no == todelete)
        tmpitem = item;
}
infolist.Remove(tmpitem);