插入排序双重链接列表问题

时间:2014-10-04 14:46:51

标签: c# doubly-linked-list insertion-sort

有时,当我运行此代码时,Current.Next.Data = Hold.Data;上会出现空引用异常。

   private void InsertionSort()
    {
        for (Node FirstUnsorted = _Head.Next; FirstUnsorted != null; FirstUnsorted = FirstUnsorted.Next)
        {
            Node Hold = FirstUnsorted;
            Node Current;

            for (Current = FirstUnsorted.Prev; Current != null && Current.Data.CompareTo(Hold.Data) > 0; Current = Current.Prev)
                Current.Next.Data = Current.Data;

            Current.Next.Data = Hold.Data;
        }
    }

我知道如果当前节点等于null,则无法引用下一个节点,但是我无法确定解决方案。

如何防止此问题发生?

2 个答案:

答案 0 :(得分:1)

每当数据首先插入列表中时,Current将为空。当您查找插入数据的位置时,检查Current != null是循环的结束。

检查一个空引用,它将告诉您将数据放在第一项中:

if (Current == null) {
  _Head.Next.Data = Hold.Data;
} else {
  Current.Next.Data = Hold.Data;
}

您也可以让Current指向数据应该结束的节点而不是之前的节点:

for (Current = FirstUnsorted; Current.Prev != null && Current.Prev.Data.CompareTo(Hold.Data) > 0; Current = Current.Prev) {
  Current.Data = Current.Prev.Data;
}
Current.Data = Hold.Data;

旁注:您正在对列表中的数据进行洗牌以在相关位置插入数据,而自然的事情是将节点插入到正确的位置。您正在使用链接列表,就好像它只是一个数组,您需要将数据移动到插入位置。

答案 1 :(得分:0)

您需要检查Current.Next != nullCurrent已存在相同的检查,因此您了解此逻辑)。试试这个:

   private void InsertionSort()
   {
        for (Node FirstUnsorted = _Head.Next; FirstUnsorted != null; FirstUnsorted = FirstUnsorted.Next)
        {
            Node Hold = FirstUnsorted;
            Node Current;

            for (Current = FirstUnsorted.Prev; Current != null && Current.Next != null && Current.Data.CompareTo(Hold.Data) > 0; Current = Current.Prev)
                Current.Next.Data = Current.Data;

            if (Current.Next != null)
                Current.Next.Data = Hold.Data;
        }
    }