C#如何在LinkedList中插入特定索引上的节点

时间:2018-03-24 09:18:14

标签: c# linked-list

我有一个学校作业,这个作业的一部分是在两个其他节点之间插入一个链表节点。这是方法。

public static void insert(LinkedList<Person> list, int index, Person data)
    {

    }

我已经阅读了一些关于LinkedList的文章,我发现每个链表都需要头尾。我只是不确定如何实现它,因为我们只允许LinkedList<T>LinkedListNode<T>使用它们提供的大部分功能。

我想我必须使用while循环来获取给定的索引,但我不知道如何通过LinkedList。

public static void insert(LinkedList<Person> list, int index, Person data)
    {
        int counter = 0;

        while (counter <= index)
        {
            if (counter == index)
            {

            }

            counter = counter + 1;
        }
    }

因此,我想知道如何在特定索引的data中插入LinkedList以及如何在此方案中创建头部和尾部。 注意:我不允许更改方法的签名。

1 个答案:

答案 0 :(得分:2)

这是一项有趣的任务。我想知道你的老师是否知道.Net Frameworks源代码是公开的。虽然您被禁止使用LinkedList<T>.AddAfter之类的方法,但您可以自由查看源代码并查看该方法是如何实现的,让我们说...只需复制代码? ; - )

查看:https://referencesource.microsoft.com/#System/compmod/system/collections/generic/linkedlist.cs,3fc9552feecc5b5c

在那里你会看到这个AddAfter - 方法:

的实现
public void AddAfter(LinkedListNode<T> node, LinkedListNode<T> newNode) {
    ValidateNode(node);
    ValidateNewNode(newNode);
    InternalInsertNodeBefore(node.next, newNode);
    newNode.list = this;
}

您感兴趣的部分是由InternalInsertNodeBefore() - 方法调用的内部方法AddAfter()

它位于同一个班级 - 您可以通过输入 ctrl + f 找到它:

private void InternalInsertNodeBefore(LinkedListNode<T> node, LinkedListNode<T> newNode) {
    newNode.next = node;
    newNode.prev = node.prev;
    node.prev.next = newNode;
    node.prev = newNode;            
    version++;
    count++;
}

在那里,您可以看到它是如何完成的,并且可以获得一些灵感&#34;。手动设置countversion会出现问题。它们只能由LinkedList中的函数设置。我认为您无法设置count - 变量。但是,以这种方式添加新元素应该可行。

编辑1 当然,您必须首先获取所需索引的列表的当前元素。您可以致电list.ElementAt(index)获取。它将返回LinkedListNode<Person>节点。与您的新Person节点一起,您可以呼叫InternalInsertNodeBefore()。如你所见,你不需要任何循环。

编辑2 似乎我必须道歉。我还没有看到NextPrevious - LinkedListNode<T>的值也是只读值。请参阅:https://referencesource.microsoft.com/#System/compmod/system/collections/generic/linkedlist.cs,08181ebdd4cdf907

此外,微软密封了这个类。因此,无法通过新类继承它并覆盖NextPrevious来添加setter方法。看来你必须自己实现一个全新的LinkedList-和LinkedListNode-Class。关于此主题已有一个问题:Creating a very simple linked list

这是我想到的代码。但 IT WON&#t; T 因为nextprevhead是内部对象。他们有NextPreviousFirst等公开引用,但它们是只读的。

public static void insert(LinkedList<Person> list, int index, Person data)
{
    int currentIndex = 0;
    var currentNode = list.head;
    if (index >= 0)
    {
        while (currentNode != null && currentIndex <= index)
        {
            if (currentIndex == index)
            {
                data.next = currentNode;
                data.prev = currentNode.prev;
                currentNode.prev.next = data;
                currentNode.prev = data; 
            }
            currentIndex++;
            currentNode = currentNode.next;
        }
    }
}