1

我正在尝试对链接列表进行排序。我有一个名为 head 的节点,它指向下一个节点,等等。

但是当我尝试按节点携带的值对节点进行排序时,我得到了排序工作,因为我看到它打印出 if 语句中的内容,但我没有取回链接列表。我哪里做错了?

Node* head;
void sortlist(){

Node * runner = head;
Node * runner2;

for(runner = head; runner->next != NULL; runner = runner->next){
    for(runner2 = runner->next; runner2->next != NULL; runner2 = runner2->next){
        if(runner->freq < runner2->freq){
            cout<< runner->freq<< " is LT "<<runner2->freq<< endl;
            Node * temp = runner;
            runner = runner2;
            runner2 = temp;
        }
    }
}

head = runner;
} 

我只取回第一个节点。

4

2 回答 2

3

为了交换链表中的两个元素,请考虑您需要更改的内容。例如,从

Head -> First -> Second -> (NULL)

Head -> Second -> First -> (NULL)

您需要更新Head.nextFirst.next Second.next。尝试交换节点时,您不会更改任何这些内容,因此它不可能达到您的预期。


只是交换(即swap(runner->freq, runner2->freq))会简单得多。

于 2013-03-26T16:04:47.680 回答
2

你会停止 when runner->next == NULL;,这应该是最后一个元素。然后设置 head = runner;,这意味着 head 将始终是此例程之后的最后一个元素。此外,我不相信这种交换。

似乎你隐约想做一个插入排序。如果您想对链表进行简单排序,我建议您使用选择排序:您创建另一个空列表l2,每次从第一个列表中删除最小元素,并将其添加为l2. 第二个列表的代码很简单:

void prepend(Node* node, Node** list){
   //null checks if you want
   node->next = *list;
   *list=node->next;
}
于 2013-03-26T15:56:35.653 回答