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

时间:2018-11-15 09:06:12

标签: 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;
            temp.Invalidate();                
        }

        head = null;
        count = 0;             
        version++;     
    }

因此,这种清除方法显然适用于O(N)。

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;
    }           
}   

我想知道为什么我们不能仅将null分配给head而不是使所有引用都为null?据我所知,将null分配给head将导致中断圆,并且所有节点将很快由GC收集。还是我错过了什么?

1 个答案:

答案 0 :(得分:2)

这样做是为了清除链接列表后,任何尝试引用列表中旧节点的引用都将引发错误。

如果旧链接未设置为null,则只要有任何指向其任何节点的引用,旧链接列表将保持可访问状态,这将(a)隐藏问题,因为代码显然将继续起作用,并且( b)使节点对象保持在内存中。