Java - 使用链接列表指针合并排序

时间:2012-04-11 10:05:33

标签: java sorting

我在实现链接列表的合并排序时遇到问题,特别是合并部分。我正在尝试对包含字符串的链表进行排序,并按字母顺序对它们进行排序。但是,我的合并代码有时会因某种原因跳过指针,具体取决于原始列表的顺序。目前我有:

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,并且没有指针错过。

感谢任何帮助。

感谢。

2 个答案:

答案 0 :(得分:2)

我认为这是因为你持有左右的旧指针,这可能不再是子列表的头部。

更改

 mergeSort(left);
 mergeSort(right);

 left = mergeSort(left);
 right = mergeSort(right);

答案 1 :(得分:1)

这可能不值得回答,但现在是。

要弄清楚那里发生了什么有点困难,我没有注意到实现中有任何明显的错误(虽然我不会在合并部分使用递归,但是“迭代地”实现它更简单)

在我看来,你需要一步一步弄清楚发生了什么。如果您知道一些有效且不起作用的示例(似乎就是这样),请使用预期的输入直接调用每个方法。

例如,要确定您的拆分是否有效,请创建一个列表并将其传递给拆分,打印结果。然后在split创建的两个列表上调用split,依此类推,以确保发生了什么。 (现在是使用JUnit的好时机,但如果你愿意的话,你可以通过“手”来做到这一点。

如果split可以解决您可以想到的几种情况,那么使用两个列表调用merge例程,并以相同的方式分析结果。如果可行,则将一些调试输出添加到合并中。

基本上,独立测试算法的每个部分,我会更快地找出问题,然后再将其视为一个整体。

很抱歉写了一面文字,仍然没有回答这个问题,但这就是我试图解决问题的方法。