我很想知道为什么LinkedListNode类公开的所有属性(Next,Previous,Value等)都是只读的,即这些属性没有相应的setter?
我试图解决与链接列表相关的小算法问题,并决定使用.Net内置的LinkedList类。但是由于LinkedListNode的类属性的只读行为,我无法覆盖这些值或更改" Next"任何给定节点的指针。
由于
答案 0 :(得分:6)
Value
确实有一个setter,声明为public T Value { get; set; }
。
Next
和Previous
上缺少设置者会阻止您将链接列表转换为LinkedList
方法无法应对的树或其他拓扑。
您可以使用列表的方法(例如AddBefore
)更改这些属性,这些方法可以保留每个LinkedListNode
只是一个列表成员的不变量,node.Next.Previous
始终指向node
1}},没有周期等等。
答案 1 :(得分:2)
Next
/ Previous
只是为了确保您不会搞砸列表结构。您必须使用LinkedList<T>
方法来修改列表,并确保您不会以错误的状态结束。让你改变参考文献就可以了。
即使MSDN states,Value
无法设置,如果您查看LinkedListNode<T>
source code,您会发现实际上已经定义了一个setter!
// Note following class is not serializable since we customized the serialization of LinkedList.
[System.Runtime.InteropServices.ComVisible(false)]
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;
}
}
所以你应该能够改变价值。