我试着写一个排序链表的方法。 这是我的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;
}
答案 0 :(得分:1)
一些提示:
如果您想要最小的数字,那么current.getNext().getValue() > tempMax.getValue()
应该有>
而不是<
如果第一个元素已经是最小值,那么您的代码也将失败,因为您尝试对null
执行某些操作
我也可以在这里看到重复的代码,current = current.getNext()
。指针操作通常难以编码,编写更加清晰的代码坚持不要重复自己的原则可能会帮助你看到错误!
如果您打印编译器/运行时错误消息,这将有助于此处的人员
答案 1 :(得分:1)
您的代码的主要问题是,当节点已经处于它应该的位置时,它会出错。如果我们执行:
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 = toHere so tempMax-&gt; tempMax,其他元素消失了
因此,表现形式prev
在某种程度上无效。
有一个快速修复,比如在toHere
最大时跳过重新定位,
但快速修复不是你需要的。你应该:
tempMax
应始终是prev
的下一个,因此仅prev
就足够了。否则你会花脑细胞保持一致性。