Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LinkedList中清除O(N)。为什么?_C#_Linked List_Doubly Linked List - Fatal编程技术网

C# 在LinkedList中清除O(N)。为什么?

C# 在LinkedList中清除O(N)。为什么?,c#,linked-list,doubly-linked-list,C#,Linked List,Doubly Linked List,LinkedList的内置实现是一个双链接循环列表 我看到了Clear方法的以下实现: public void Clear() { LinkedListNode<T> current = head; while (current != null ) { LinkedListNode<T> temp = current; current = current.Next;

LinkedList的内置实现是一个双链接循环列表

我看到了Clear方法的以下实现:

public void Clear() {
        LinkedListNode<T> current = head;             
        while (current != null ) {
            LinkedListNode<T> temp = current;
            current = current.Next;
            temp.Invalidate();                
        }

        head = null;
        count = 0;             
        version++;     
    }
public void Clear(){
LinkedListNode当前=头;
while(当前!=null){
LinkedListNode温度=当前;
当前=当前。下一步;
临时失效();
}
head=null;
计数=0;
版本++;
}
所以,这种清除方法显然适用于O(N)

公共密封类LinkedListNode{
内部链接列表;
下一步是内部LinkedListNode;
内部LinkedListNode prev;
内部T项目;
公共LinkedListNode(T值){
此项=值;
}
内部LinkedListNode(LinkedList列表,T值){
this.list=列表;
此项=值;
}
公共链接列表{
获取{返回列表;}
}
公共LinkedListNode下一步{
获取{return next==null | | next==list.head?null:next;}
}
公共LinkedListNode上一个{
获取{return prev==null | | this==list.head?null:prev;}
}
公共价值{
获取{return item;}
设置{item=value;}
}
内部无效失效(){
列表=空;
next=null;
prev=null;
}           
}   

我想知道为什么我们不能将null赋值给head,而不是将所有引用都赋值为null?就我所见,将null分配给头部将导致打破循环,所有节点都将很快被GC收集。还是我遗漏了什么?

这样做的目的是,一旦链接列表被清除,任何包含对其旧节点引用的内容都将在尝试浏览列表时抛出错误


如果旧链接未设置为null,则如果任何内容引用了其任何节点,则旧链接列表将保持可访问状态,这将(a)隐藏问题,因为代码将继续工作,并且(b)保持内存中节点对象的活动状态。

这样做是为了在清除链接列表后,任何包含对其旧节点的引用的对象,如果试图在列表中导航,都将抛出错误


如果旧链接未设置为null,则如果任何内容引用了其任何节点,则旧链接列表将保持可访问性,这将(a)隐藏问题,因为代码将继续工作,并且(b)保持内存中节点对象的活动状态。

这可能是程序保留对节点的引用时发生的。这将导致它没有下一个/上一个,因为整个linkedlist都已分解。我想不出还有什么别的办法。这可能是因为程序保留了对节点的引用。这将导致它没有下一个/上一个,因为整个linkedlist都已分解。我想不出别的了。
public sealed class LinkedListNode<T> {
    internal LinkedList<T> list;
    internal LinkedListNode<T> next;
    internal LinkedListNode<T> prev;
    internal T item;

    public LinkedListNode( T value) {
        this.item = value;
    }

    internal LinkedListNode(LinkedList<T> list, T value) {
        this.list = list;
        this.item = value;
    }

    public LinkedList<T> List {
        get { return list;}
    }

    public LinkedListNode<T> Next {
        get { return next == null || next == list.head? null: next;}
    }

    public LinkedListNode<T> Previous {
        get { return prev == null || this == list.head? null: prev;}
    }

    public T Value {
        get { return item;}
        set { item = value;}
    }

    internal void Invalidate() {
        list = null;
        next = null;
        prev = null;
    }           
}