1

我只需要 C# 中的链表帮助,C++ 中的链表对于指针来说有点容易,但我在 C# 中遇到了一些问题我阅读了http://msdn.microsoft.com上提供的示例,但我不知道如何链接两个不同的链表

有效的方式似乎是将 LinkedListNode 放入一个链表中,所以假设我有两个链表

LinkedList L1 = new LinkedList(); LinkedList L2 = new LinkedList(); 然后假设我有以下节点

        LinkedListNode<String> Ln1 = new LinkedListNode<String>("Orange");
        LinkedListNode<String> Ln2 = new LinkedListNode<String>("Banana");
        LinkedListNode<String> Ln3 = new LinkedListNode<String>("Apple");
        LinkedListNode<String> Ln4 = new LinkedListNode<String>("Strawberry");

我只是将它们添加到我拥有的列表中:

        L1.AddLast(Ln1);
        L1.AddLast(Ln2);
        L2.AddLast(Ln3);
        L2.AddLast(Ln4);

好的,现在假设我想将 L1 的最后一个元素链接到 L2 中的第一个元素,这可能吗?我首先尝试了这个:

L1.Last.Next = L2.First; 我完全失败并出现错误:无法将属性或索引器“System.Collections.Generic.LinkedListNode&lt;string>.Next”分配给——它是只读的

好吧,我试过了:

Ln2.Next = Ln3; 我又失败了

我最后一次尝试是

        LinkedListNode<String> node1=L1.Last;
        LinkedListNode<String> node2 = L2.First;
        node1.Next = node2;

出现错误:无法将属性或索引器“System.Collections.Generic.LinkedListNode&lt;string>.Next”分配给——它是只读的

所以有什么帮助吗?如何链接它们?

一个附加问题:例如,是否可以通过索引到达链表中的元素?

我提出了这个简单的算法,它可以工作:

         int i = 0;
        foreach (var item in L2)
        {
            Console.WriteLine(item);
            i++;
        }

有自动的方法吗?

感谢您的帮助

4

2 回答 2

2

LinkedListNode 具有属性列表。该属性指向列表,该节点属于哪个节点。当您将节点添加到某个列表时会设置此属性。因此,在某一时间节点可能只属于一个列表。这意味着您应该先从一个列表中删除节点,然后再将其添加到另一个列表中:

var node = L2.First;
L2.RemoveFirst();
L1.AddLast(node);

如果要从 L2 添加所有节点,可以使用:

while (L2.Count > 0)
{
    var node = L2.First;
    L2.RemoveFirst();
    L1.AddLast(node);
}

请记住,它将从 L2 中删除所有节点。

另一种选择 - 创建具有相同值的新节点:

foreach (string value in L2)
    L1.AddLast(value);

更新:如果你想通过它的索引到达链表中的一个元素,你可以跳过前 N 个项目并取下一个:

L1.Skip(index).First()

与任何集合一样,您应该验证该列表至少有 N-1 个节点。

于 2012-04-18T21:03:22.117 回答
1

回答您的第一个问题,将 L1 的最后一个元素链接到 L2 的第一个元素

L2.AddFirst(L1.Last.Value);
于 2012-04-18T21:10:01.387 回答