我正在尝试对链表进行排序。我有一个名为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;
}
我只回到第一个节点。
答案 0 :(得分:3)
要交换链接列表中的两个元素,请考虑需要更改的内容。例如,来自
Head -> First -> Second -> (NULL)
到
Head -> Second -> First -> (NULL)
您需要更新:Head.next
,First.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;
}