有时,当我运行此代码时,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,则无法引用下一个节点,但是我无法确定解决方案。
如何防止此问题发生?
答案 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 != null
(Current
已存在相同的检查,因此您了解此逻辑)。试试这个:
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;
}
}