C#LinkedList AddAfter

时间:2016-03-02 10:16:58

标签: c# linked-list

我正在尝试使用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()

那我怎么能克服这个僵局呢?提前致谢

2 个答案:

答案 0 :(得分:1)

AddAfter(node, newNode)需要2件事,node必须属于列表,newNode不能属于列表,这一切都很好,并删除了sortedListBoundary如果不是以下情况,tempNode之后添加它应该有效:

你初始化(在for循环中)tempNode = list.First然后LinkedListNode<int> sortedListBoundary = tempNode;所以现在sortedListBoundary = tempNode = list.FirstsortedListBoundary.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
)