双链表中的冒泡排序 - 空指针错误

时间:2013-04-13 17:31:47

标签: java sorting bubble-sort doubly-linked-list

protected void sortHorseList(int iHorseCount)
{
    int i = 0;
    Horsie currentNode = head;
    Horsie auxNode = new Horsie();
    boolean foundChange = true;
    while(foundChange)
    {
        foundChange = false;
        for(i=0; i<iHorseCount-1; i++)
        {
            if (currentNode.getHorseValue() > currentNode.getNext().getHorseValue())
            {
                auxNode.setHorseValue(currentNode.getHorseValue());
                currentNode.setHorseValue(currentNode.getNext().getHorseValue());
                currentNode.getNext().setHorseValue(auxNode.getHorseValue());
                foundChange = true;
            }
            currentNode = currentNode.getNext();
        }
    }
}

运行主程序时,此代码显示空指针错误。我是数据结构的新手,我希望能帮助你解决这个问题!请教我如何在双向链接列表中使用冒泡排序 ... HEEELP!

1 个答案:

答案 0 :(得分:1)

当你到达列表的末尾时,你不会检查下一个元素是否存在。因此,当您尝试访问它的值时,您将获得空引用异常。你的内循环应该看起来像

   Horsie currentNode = head;
   Horsie nextNode = currentNode != null ? currentNode.getNext() : null;
   while (currentNode != null && nextNode != null)
    {
        if (currentNode.getHorseValue() > nextNode.getHorseValue())
        {
            currentNode = Swap(head,currentNode,nextNode);
            foundChange = true;
        }
        else
        {
            currentNode = nextNode;
        }
        nextNode = currentNode.getNext();
    }

Swap(Horsie current, Horsie next)在列表中交换currentnext的位置,如果current是头节点,则可选择更新头部。

我还会注意到想要交换列表中的节点而不是交换节点之间的值,除非您确定列表中只包含对节点对象的引用。如果你没有冒险让一些其他类的对象意外地变异,因为你在排序过程中改变了它的价值。