C# 在LinkedList中清除O(N)。为什么?
LinkedList的内置实现是一个双链接循环列表 我看到了Clear方法的以下实现: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;
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;
}
}