JAVA-按降序排列链表
我试图写一个对链表排序的方法。 这是我的java培训 该方法应获取带有值的链表,并使用选择排序对其进行排序。 但是不是通常的选择排序,而是找到最大数字并将其放在链表开头的选择排序。直到列表被排序 我试着跟随调试器,但我不能真正理解我做错了什么 这就是我所累的:JAVA-按降序排列链表,java,algorithm,sorting,Java,Algorithm,Sorting,我试图写一个对链表排序的方法。 这是我的java培训 该方法应获取带有值的链表,并使用选择排序对其进行排序。 但是不是通常的选择排序,而是找到最大数字并将其放在链表开头的选择排序。直到列表被排序 我试着跟随调试器,但我不能真正理解我做错了什么 这就是我所累的: public IntList selectionSort() { IntNode tempMax = _head; IntNode current = _head; IntNode fromHere = null;
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
//prev仍然指向4,1消失5->4->3->2
//tempMax=to此处,因此tempMax->tempMax,其他元素都消失了 因此表现为5->4->4
在某种程度上是无效的。 有一个快速修复方法,比如当prev
到此处
是的,请使用为最大值时跳过重新定位, 但快速修复并不是你所需要的。你应该:
- 重新思考一些特殊情况。空列表,一个元素,列表已排序,列表反向排序,随机顺序,(重复元素??)
- 为每种情况编写单元测试
- 重写你的算法,避免哦,是的,我忘了这个案例…。沉默下来,您只需要在每个给定步骤中用该步骤中找到的最大值替换第一个元素李>
- 避免有冗余信息的变量。例如,
应该始终是tempMax
的下一个,因此仅prev
就足够了。否则,你将花费脑细胞来保持一致性prev
- 再次测试套件案例
为什么不在=
中移动值,而不是在IntNode
中移动。您能在代码中添加一些注释吗?我很难跟踪哪个变量用于什么。IntNode