排序节点(Linked-list)C ++

时间:2013-03-26 15:49:43

标签: c++ sorting linked-list nodes

我正在尝试对链表进行排序。我有一个名为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;
} 

我只回到第一个节点。

2 个答案:

答案 0 :(得分:3)

要交换链接列表中的两个元素,请考虑需要更改的内容。例如,来自

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

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

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


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

答案 1 :(得分:2)

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

你似乎很想做insertion sort。如果您想对链接列表进行简单排序,我建议您使用selection sort:您创建另一个空列表l2,每次从第一个列表中删除最小元素,然后添加它作为l2的负责人。第二个列表的代码很简单:

void prepend(Node* node, Node** list){
   //null checks if you want
   node->next = *list;
   *list=node->next;
}