我有一个学校作业,这个作业的一部分是在两个其他节点之间插入一个链表节点。这是方法。
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
以及如何在此方案中创建头部和尾部。
注意:我不允许更改方法的签名。
答案 0 :(得分:2)
这是一项有趣的任务。我想知道你的老师是否知道.Net Frameworks源代码是公开的。虽然您被禁止使用LinkedList<T>.AddAfter
之类的方法,但您可以自由查看源代码并查看该方法是如何实现的,让我们说...只需复制代码? ; - )
在那里你会看到这个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;。手动设置count
和version
会出现问题。它们只能由LinkedList中的函数设置。我认为您无法设置count
- 变量。但是,以这种方式添加新元素应该可行。
编辑1 :当然,您必须首先获取所需索引的列表的当前元素。您可以致电list.ElementAt(index)
获取。它将返回LinkedListNode<Person>
节点。与您的新Person节点一起,您可以呼叫InternalInsertNodeBefore()
。如你所见,你不需要任何循环。
编辑2 :似乎我必须道歉。我还没有看到Next
和Previous
- LinkedListNode<T>
的值也是只读值。请参阅:https://referencesource.microsoft.com/#System/compmod/system/collections/generic/linkedlist.cs,08181ebdd4cdf907
此外,微软密封了这个类。因此,无法通过新类继承它并覆盖Next
和Previous
来添加setter方法。看来你必须自己实现一个全新的LinkedList-和LinkedListNode-Class。关于此主题已有一个问题:Creating a very simple linked list
这是我想到的代码。但 IT WON&#t; T 因为next
,prev
和head
是内部对象。他们有Next
,Previous
和First
等公开引用,但它们是只读的。
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;
}
}
}