插入排序双向链接列表问题
问题描述:
有时,当我运行此代码时,空引用异常发生在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;
}
}
我知道,你不能引用下一个节点,如果当前节点是等于无效,但我无法确定一个解决方案。
如何防止发生此问题?
答
每当数据将出现在列表中插入,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;
边注:您在列表中洗牌的数据在corret地方插入数据,当自然的事情将是插入在正确的地方,而不是节点。您正在使用链接列表,就好像它只是一个数组,您需要移动数据以便插入。
答
你需要检查,即Current.Next != null
(Current
已经存在相同的chech,所以你明白这个逻辑)。试试这个:
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;
}
}
如果'Current'等于null,则不能检查Current.Next'是否为null,因为Current.Next不存在。 – TheAuzzieJesus 2014-10-04 15:02:48
只是跳过移动将从列表中删除数据并导致重复的引用。 – Guffa 2014-10-04 15:03:26
@TheAuzzieJesus,是的,这是真的。太好了,你明白了!我们只在检查Current后检查'Current.Next',因为我们不想有空的解引用错误。 – Ilya 2014-10-04 15:05:26