从链表中删除C#

God*_*ene 6 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

希望有道理.

Jon*_*eet 24

是的,您不能迭代集合并同时修改它.但是,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;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,node = node.Next;作为最后一行,您无法逃脱; 删除后,节点无效.

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

  • 考虑到"Remove(T)"与"Remove(LinkedListNode <T>)"的时间复杂度,这也具有O(n)而不是O(n ^ 2)的优点. (2认同)
  • @Jadoon:`LinkedList&lt;T&gt;` 一开始并不声称是线程安全的。 (2认同)