在C#中,我目前正在尝试将某个节点从某个LinkedList链接到另一个LinkedList中的另一个节点。我试图将这个用于一个游戏,其中瓷砖连接在彼此顶部堆叠的水平。但是,更改列表中的Next属性会产生错误。这是代码:
tileList2.First.Next = tileList1.First;
这是错误;
属性或索引器' LinkedListNode.Next'无法分配 - 它是只读的。"
我怎样(否则)将此节点的Next设置为另一个节点的First?导致此错误的原因是什么?有没有解决方法?
答案 0 :(得分:0)
你不能直接设置LinkedListNode.Next
,它是只读的。
您也无法使用LinkedList.AddLast
,因为您尝试添加的LinkedlListNode
已在列表中。
你实际上需要打破列表并创建新列表。
或者您可以实现自己的链接列表。
答案 1 :(得分:0)
LinkedList的框架实现中的每个节点都有对包含它的列表的引用,这使得将元素传递到另一个列表O(n) instead of O(1),这违背了链表实现的目的。如果要在此实现中将元素传输到另一个列表,则必须逐个删除并添加它们(使用列表中的Remove和AddAfter),以便它们各自获得对另一个列表的引用。
我怀疑这不是你所追求的。正如其他评论所述,您的列表的需求可能很简单,您最好自己制作更简单的链表。这个问题已经在SO(Creating a very simple linked list)的其他地方得到了解决。
由于答案不包括简单的枚举和初始化,我自己做了。
class ListNode<T> : IEnumerable<T>
{
public T data;
public ListNode<T> Next;
private ListNode() { }
public ListNode(IEnumerable<T> init)
{
ListNode<T> current = null;
foreach(T elem in init)
{
if (current == null) current = this; else current = current.Next = new ListNode<T>();
current.data = elem;
}
}
class ListEnum : IEnumerator<T>
{
private ListNode<T> first;
private ListNode<T> current;
bool more;
public ListEnum(ListNode<T> first) { this.first = first; more = true; }
public T Current { get { return current.data; } }
public void Dispose(){}
object System.Collections.IEnumerator.Current { get { return current.data; } }
public void Reset() { current = null; more = true; }
public bool MoveNext()
{
if (!more)
return false;
else if (current == null)
return more = ((current = first) != null);
else
return more = ((current = current.Next) != null);
}
}
public IEnumerator<T> GetEnumerator()
{
return new ListEnum(this);
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
static void Main(string[] args)
{
ListNode<int> l1 = new ListNode<int>(new int[] {3,1,4,1,5,9});
ListNode<int> l2 = new ListNode<int>(new int[] { 5 });
l2.Next = l1.Next;
foreach (int i in l2)
Console.WriteLine(i);
}