我正在尝试删除一个节点,如果x当前与我的链表中的int匹配。
我尝试了这个,但是一旦删除了节点,就会在检查foreach循环时抛出错误
public void DeleteNode(int x, LinkedList<name> myLinkedList) {
foreach (name item in myLinkedList) {
if (item.num.equals(x)) mylinkedList.Remove(x);
}
}
希望这是有道理的。
答案 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);