如何将一个LinkedList中的节点的Next属性设置为另一个LinkedList中的另一个节点
本文关键字:节点 另一个 LinkedList 属性 Next 设置 一个 | 更新日期: 2023-09-27 18:14:51
在c#中,我目前正在尝试将某个LinkedList中的一个节点链接到另一个LinkedList中的另一个节点。我正尝试着为一款游戏创造这样的内容,即在关卡中砖块相互堆叠在一起。但是,更改列表中的Next属性会产生错误。这是代码:
tileList2.First。
这是错误;
属性或索引器'LinkedListNode。Next'不能被分配——它是只读的。"
如何(否则)将此节点的Next设置为其他节点的First ?是什么导致了这个错误?有什么变通办法吗?
LinkedList框架实现中的每个节点都有一个对包含它的列表的引用,这使得将元素转移到另一个列表的操作从O(1)变为O(n),这违背了链表实现的目的。如果您想在这个实现中将元素转移到另一个列表中,您必须逐个删除和添加它们(在列表中使用remove和AddAfter),以便它们每个都获得对另一个列表的引用。
我怀疑这不是你想要的。正如其他评论所说,您的列表的需求可能足够简单,因此您最好创建自己的更简单的链表。这个问题已经在SO的其他地方解决了(创建一个非常简单的链表)。
由于这个答案不包括简单的枚举和初始化,所以我自己做了一个。
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);
}
不能直接设置LinkedListNode.Next
,为只读。
您也不能使用LinkedList.AddLast
,因为您试图添加的LinkedlListNode
已经在列表中。
你实际上需要打破列表并创建新的列表。
或者你可以实现你自己的链表