答案的方法是使用头插法,我第一遍看的时候有点绕。补充的答案是将链表复制到一个数组中,再用时间复杂度为O(nlogn)的排序算法进行排序,这个很容易理解。
在此,我想记录一下自己写这个题目的方法。
思路
- 我的思路是先联想数组的排序算法中哪种可以适用到链表
- 最先想到的是冒泡排序和快速排序(对我而言),但是二者用在链表上都不好实现
- 我又想到了另一种—选择排序,先用指针指向第一个节点,然后去找所有节点中最小的,找到后将
data
,与指针指向的节点的data交换。于是,最小的data就放在了第一个节点中。 - 指针后移,再找从第二个节点开始最小的元素,再与之交换,以此类推。
- 即:每次都把最小的节点的data和指针指向的元素的data进行交换
书写
void sort_link(LinkList &L){
ElemType min,temp;
LinkList p,q;
mindex = NULL;// mindex初始化为空
p = L->next;
while(p->next != NULL) {
// 最多被比较到倒数第二个节点就够了
min = p->data;// 初始的最小值,每次也都是p->data
q = p->next;
while( q!= NULL) {// 一直到最后一项要和min去比较
if(q->data <min){
min = q->data;
mindex = q;
}
q = q->next;
}// 最里层的while循环结束,意味着找到了最小的data
if(mindex != NULL){
//如果mindex不为空,则表示之后的节点有比p->data更小的,因此进行交换
temp = p->data;
p-data = min;
mindex->data = temp;// 记住这里是mindex,而不是q
//因为跳出循环,q就等于NULL了
}
// p指针再后移,进行下一轮内循环
p = p->next;
}
}