从链表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);
    }
}

希望你明白。

从链表c#中移除

是的,您不能在迭代集合的同时修改它。然而,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;
        
    }