如何将一个LinkedList中的节点的Next属性设置为另一个LinkedList中的另一个节点

本文关键字:节点 另一个 LinkedList 属性 Next 设置 一个 | 更新日期: 2023-09-27 18:14:51

在c#中,我目前正在尝试将某个LinkedList中的一个节点链接到另一个LinkedList中的另一个节点。我正尝试着为一款游戏创造这样的内容,即在关卡中砖块相互堆叠在一起。但是,更改列表中的Next属性会产生错误。这是代码:

tileList2.First。

这是错误;

属性或索引器'LinkedListNode。Next'不能被分配——它是只读的。"

如何(否则)将此节点的Next设置为其他节点的First ?是什么导致了这个错误?有什么变通办法吗?

如何将一个LinkedList中的节点的Next属性设置为另一个LinkedList中的另一个节点

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已经在列表中。

你实际上需要打破列表并创建新的列表。

或者你可以实现你自己的链表