0

我很难解决这个问题。我已经花了几个小时,但无法弄清楚。

我有一个链接列表,我正在尝试手动排序。我的节点称为 CNodes。有一个 start CNode、一个 tail CNode 和一个 newNext CNode。

每个节点都包含一个联系人。联系人有一个名字,我正尝试按该名字对列表进行排序。

我知道有更多自动的方法可以做到这一点,但我需要证明我了解如何排序(显然我现在不知道)。

我试图通过迭代每个节点并将其与开始进行比较,然后在符合条件的情况下更改开始实体来做到这一点。

这段代码不工作......我已经工作了两天,真的被卡住了。

任何具体的建议将不胜感激。

CNode nextNode=start;
while(nextNode.getNext()!=null) {
    CNode newNext;
    tail=nextNode;
    while(tail!=null) {
        if(start.getContact().getStrFirstName().compareTo(tail.getContact().getStrFirstName()) > 0) {
            //We put the starting node in a temp node
            newNext=start;
            newNext.setNext(tail.getNext());


            //We set our current node to the start
            start=tail;
            start.setNext(newNext);

            //Set the next node of start to the original next one of the one we
            //just removed from the chain

            //Set current marker to the new first nodes' next entity
            tail=start.getNext();
            //Set the next node for the marker to the one we just removed

        } else {
            tail=tail.getNext();
        }

    }
    nextNode=nextNode.getNext();                 
}
4

2 回答 2

0

所以你正在做的是冒泡排序。对于什么是什么的视觉表示,看看这个(来自维基百科):http: //upload.wikimedia.org/wikipedia/commons/c/c8/Bubble-sort-example-300px.gif

所以在while循环中,当两个节点需要切换时,我们要把'next'(当前)节点存入一个temp,将tail放入next节点,将temp放入tail,就像一个三角形。

                        temp
                       /    ^
                      /      \
                     V        \
                   tail  -- next

我试图重写您的代码,但是对于 start 是否是您的根节点感到困惑,如果不是,您是什么根节点。如果是,它应该只使用一次,那就是声明你是尾节点。

祝你好运,希望能帮到你

斯特凡诺

于 2013-05-30T20:58:51.763 回答
0

你能做的最好的事情是从一个数组开始,然后把排序概念放下。您还需要弄清楚您要进行哪种类型的排序,您目前正在尝试进行冒泡排序。还有合并排序、快速排序等。一旦你选择了你想要的排序类型,你就可以在一个数组上执行它,然后移动到节点。

这里有一些种类:

于 2013-05-28T04:41:10.660 回答