JAVA-按降序排列链表

JAVA-按降序排列链表,java,algorithm,sorting,Java,Algorithm,Sorting,我试图写一个对链表排序的方法。 这是我的java培训 该方法应获取带有值的链表,并使用选择排序对其进行排序。 但是不是通常的选择排序,而是找到最大数字并将其放在链表开头的选择排序。直到列表被排序 我试着跟随调试器,但我不能真正理解我做错了什么 这就是我所累的: public IntList selectionSort() { IntNode tempMax = _head; IntNode current = _head; IntNode fromHere = null;

我试图写一个对链表排序的方法。 这是我的java培训

该方法应获取带有值的链表,并使用选择排序对其进行排序。 但是不是通常的选择排序,而是找到最大数字并将其放在链表开头的选择排序。直到列表被排序

我试着跟随调试器,但我不能真正理解我做错了什么

这就是我所累的:

public IntList selectionSort()
{
    IntNode tempMax = _head;
    IntNode current = _head;
    IntNode fromHere = null;
    IntNode toHere = _head;
    IntNode prev = null;
    while(toHere != null)
    {
        current = toHere;
        tempMax = toHere;
        while (current != null)
        {
            if (current.getNext() != null && current.getNext().getValue() > tempMax.getValue())
                {
                    prev = current;
                    tempMax = current.getNext();
                    current = current.getNext();
                }
            else current = current.getNext();      
        }
        prev.setNext(prev.getNext().getNext());
        tempMax.setNext(toHere);            
        if (fromHere == null)
            _head = tempMax;
        else fromHere.setNext(tempMax);
        fromHere = tempMax;
        toHere = fromHere.getNext();
    }
    return this;
}
一些提示:


  • 如果您想要最小的数字,那么
    current.getNext().getValue()>tempMax.getValue()
    应该有一个
    而不是
    您的代码的主要问题是,当节点已经位于它应该位于的位置时,它会出现错误行为。如果我们以以下方式执行:

    5->1->2->3->4

    prev
    将为空,我们将崩溃

    如果我们使用:

    1->4->5->3->2

    在第一次迭代中,您获得

    5->4->1->3->2

    到目前为止还不错。然后,在第二次迭代的循环之后

    5->4->3->2
    //prev仍然指向4,1消失

    5->4->4
    //tempMax=to此处,因此tempMax->tempMax,其他元素都消失了

    因此表现为
    prev
    在某种程度上是无效的。 有一个快速修复方法,比如当
    到此处
    为最大值时跳过重新定位,
    但快速修复并不是你所需要的。你应该:

    • 重新思考一些特殊情况。空列表,一个元素,列表已排序,列表反向排序,随机顺序,(重复元素??)
    • 为每种情况编写单元测试
    • 重写你的算法,避免哦,是的,我忘了这个案例…。沉默下来,您只需要在每个给定步骤中用该步骤中找到的最大值替换第一个元素
    • 避免有冗余信息的变量。例如,
      tempMax
      应该始终是
      prev
      的下一个,因此仅
      prev
      就足够了。否则,你将花费脑细胞来保持一致性
    • 再次测试套件案例

    我知道,但我想从最大值到较小值排序。如果第一个元素已经是最小值,则说明中不会这么说。
    是的,请使用
    =
    为什么不在
    IntNode
    中移动值,而不是在
    IntNode
    中移动。您能在代码中添加一些注释吗?我很难跟踪哪个变量用于什么。