我正在尝试使用C#在下面的代码中实现插入排序。但它给了我错误:
LinkedList节点已经属于LinkedList
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
}
}
我甚至试图在temp中使用该节点。删除现有节点(sortedListBoundary),然后调用AddAfter(),但这次错误是:
节点不属于LinkedList()
那我怎么能克服这个僵局呢?提前致谢
答案 0 :(得分:1)
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);
}
}
这是我能为您的代码提供的最接近的代码,但我不知道您的目标是什么。
答案 1 :(得分:0)
LinkedListNode<int> sortedListBoundary
的类型为LinkedListNode
,而tempNode的类型为LinkedListNode<int>
LinkedList:
public LinkedListNode<T> AddAfter(
LinkedListNode<T> node,
T value
)