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

时间:2016-10-24 14:32:28

标签: c# visual-studio linked-list

在C#中,我目前正在尝试将某个节点从某个LinkedList链接到另一个LinkedList中的另一个节点。我试图将这个用于一个游戏,其中瓷砖连接在彼此顶部堆叠的水平。但是,更改列表中的Next属性会产生错误。这是代码:

tileList2.First.Next = tileList1.First;

这是错误;

  

属性或索引器' LinkedListNode.Next'无法分配 - 它是只读的。"

我怎样(否则)将此节点的Next设置为另一个节点的First?导致此错误的原因是什么?有没有解决方法?

2 个答案:

答案 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);
  }