我正在尝试在下面的代码中使用 C# 实现插入排序。但它给了我一个错误:
"链接列表"节点已属于"链接列表"
public void Sort(ref LinkedList<int> list)
{
LinkedListNode<int> tempNode = new LinkedListNode<int>(0); //Contains zero just for initalization
for(tempNode = list.First; tempNode!=null; tempNode=tempNode.Next)
{
LinkedListNode<int> sortedListBoundary = tempNode; //Contains zero just for initalization
while (sortedListBoundary.Value < sortedListBoundary.Next.Value && sortedListBoundary.Previous!=null)
{
sortedListBoundary = sortedListBoundary.Previous;
}
list.AddAfter(tempNode, sortedListBoundary); //This line gives error
}
}
我什至尝试暂时占用该节点。 删除现有节点(sortedListBoundary),然后调用AddAfter(),但这次错误是:
节点不属于 LinkedList()
那么我怎样才能克服这个僵局呢?提前致谢
AddAfter(node, newNode)
需要 2 件事,node
必须属于列表,newNode
不能属于列表,这一切都很好,如果不是为了以下原因,删除sortedListBoundary
并在 tempNode
之后添加它应该可以工作:
您初始化(在 for 循环中)tempNode = list.First
然后LinkedListNode<int> sortedListBoundary = tempNode;
,所以现在sortedListBoundary = tempNode = list.First
并sortedListBoundary.Previous == null
因为它是第一个,所以您不输入 if。所以,当你进入AddAfter
部分时,sortedListBoundary = tempNode
...您正在尝试在自身之后添加一个节点...
编辑:澄清一下,当您删除sortedListBoundary
时,因为sortedListBoundary = tempNode
您也在删除tempNode
(因为它们是相同的),因此您会收到它不在列表中的错误......您不能在列表中未列出的内容之后添加内容。
编辑 2:你要求一个解决方案,我能给出的最佳答案是不要尝试将节点放在自己之后,仔细检查插入排序算法,看看你偏离它的地方,这是插入排序的实现:
public void Sort(ref LinkedList<int> list)
{
LinkedListNode<int> tempNode;
for(tempNode = list.First.Next; tempNode!=null; tempNode=tempNode.Next)
{
LinkedListNode<int> sortedListBoundary = tempNode.Previous;
list.Remove(tempNode);
while (sortedListBoundary != null && tempNode.Value < sortedListBoundary.Value)
{
sortedListBoundary = sortedListBoundary.Previous;
}
if(sortedListBoundary == null)
list.AddFirst(tempNode);
else
list.AddAfter(sortedListBoundary, tempNode);
}
}
这是我能做的最接近你的代码,但我不知道你要去哪里。
LinkedListNode<int> sortedListBoundary
的类型是LinkedListNode
,tempNode也是LinkedListNode<int>
LinkedList 说:
public LinkedListNode<T> AddAfter(
LinkedListNode<T> node,
T value
)