从链表c#中移除
本文关键字:链表 | 更新日期: 2023-09-27 18:10:37
我正在尝试删除一个节点,如果x当前在我的链表中匹配int。
我试过了,但是一旦它删除了节点,它就会在检查foreach循环时抛出错误
public void DeleteNode(int x, LinkedList<name> myLinkedList) {
foreach (name item in myLinkedList) {
if (item.num.equals(x)) mylinkedList.Remove(x);
}
}
希望你明白。
是的,您不能在迭代集合的同时修改它。然而,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>
)。
如果您在foreach
期间调用remove,它将使枚举数无效,因此这是不允许的。
把你的foreach
改成简单的for
循环
在这种情况下,我通常创建一个临时集合,并在需要删除时将其添加到其中。然后循环遍历该列表,将其从原始列表中移除。
在不使迭代器失效的情况下,我这样写:
foreach(var item in list.Where(w=>w.num.Equals(x)).ToArray())
list.Remove(item);
我通过以下方式从列表中删除Items:
for (int j = lst.Count - 1; j >= 0; j--)
{
var elem= lst[j];
lst.Remove(elem);
}
它看起来非常接近常规的"foreach var element in lst",这就是我喜欢它的原因。
我从末尾开始,否则你会失去你的索引,并将需要跟踪删除项目的数量。
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);
public ListNode RemoveElements(ListNode head, int val)
{
if (head == null) return null;
head.next = RemoveElements(head.next, val);
return head.val == val ? head.next : head;
}