我在实现链接列表的合并排序时遇到问题,特别是合并部分。我正在尝试对包含字符串的链表进行排序,并按字母顺序对它们进行排序。但是,我的合并代码有时会因某种原因跳过指针,具体取决于原始列表的顺序。目前我有:
public node merge(node left, node right){
node result = null;
if(left == null){
return right;
}else if(right == null){
return left;
}
// The data in the node are stored as strings.
// Compare if the string in the left node is less that
// the string in the right.
if(left.info.compareTo(right.info) < 0){
result = left;
result.next = merge(left.next, right);
}else{
result = right;
result.next = merge(left, right.next);
}
return result;
}
如果我有一个由例如f-> t-> c>&gt; t-&gt; h组成的列表,我的合并将返回h-&gt; t-&gt; t,其中指针正在错过。然而,如果我的列表由b-> a-> t-> t-> c组成,则它按字母顺序正确地显示它,a-> b-> c-> t-> t,并且没有指针错过。
感谢任何帮助。
感谢。
答案 0 :(得分:2)
我认为这是因为你持有左右的旧指针,这可能不再是子列表的头部。
更改
mergeSort(left);
mergeSort(right);
到
left = mergeSort(left);
right = mergeSort(right);
答案 1 :(得分:1)
这可能不值得回答,但现在是。
要弄清楚那里发生了什么有点困难,我没有注意到实现中有任何明显的错误(虽然我不会在合并部分使用递归,但是“迭代地”实现它更简单)
在我看来,你需要一步一步弄清楚发生了什么。如果您知道一些有效且不起作用的示例(似乎就是这样),请使用预期的输入直接调用每个方法。
例如,要确定您的拆分是否有效,请创建一个列表并将其传递给拆分,打印结果。然后在split创建的两个列表上调用split,依此类推,以确保发生了什么。 (现在是使用JUnit的好时机,但如果你愿意的话,你可以通过“手”来做到这一点。
如果split可以解决您可以想到的几种情况,那么使用两个列表调用merge例程,并以相同的方式分析结果。如果可行,则将一些调试输出添加到合并中。
基本上,独立测试算法的每个部分,我会更快地找出问题,然后再将其视为一个整体。
很抱歉写了一面文字,仍然没有回答这个问题,但这就是我试图解决问题的方法。