LeetCode中等題:147. 對連結串列進行插入排序(使用C語言)
阿新 • • 發佈:2021-02-02
對連結串列進行插入排序。
插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。
插入排序演算法:
插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
重複直到所有輸入資料插入完為止。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:
輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* insertionSortList(struct ListNode* head){
//系統會很賊地輸入空的head,然後就會報錯,很煩,以防這種情況
if (head==NULL) return head;
//可能有插入頭結點之前的情況,有虛擬頭結點dummyhead作為前驅節點,可以更方便進行插入
struct ListNode* dummyhead=(struct ListNode *)malloc(sizeof(struct ListNode));
//賦值,防止記憶體洩露,反正接下來也用不到
dummyhead->val=0;
//dummyhead的下一節點指向head
dummyhead->next=head;
//建立指向已排序連結串列尾部的指標節點tail,預設指向頭節點
//就像選擇排序要先定義個用來比較的參照物一樣
struct ListNode* tail=head;//獲取head所有元素
//node指向待排序的節點,tail所指的head就當做排好了,看下一個就行了
struct ListNode* node=head->next;
//當node指向空.就結束迴圈,這裡省略了"=NULL"
while(node)
{
//如果待排序的節點正好大於尾節點tail,天助我也,這不就正好排完序了嘛
if(node->val>tail->val)
{
//既然算排完序了,尾指標tail也就指向下一個節點了
tail=tail->next;
//待排序節點node也指向下一個
node=node->next;
//下面的語句是待排序節點小於尾節點的情況,無需再執行,進入下一迴圈
continue;
}
//定義一個用來比較的節點指標compare
//每次比完都會返回頭部
struct ListNode* compare=dummyhead;
//因為dummyhead->next=head,dummyhead的next才是head
//這裡用compare->next,這樣就指向首位的節點了
//如果指標所指的值比待排序的值小,那就繼續往下走
//直到compare->next的值比node的的值大
while(compare->next->val<node->val) compare=compare->next;
//下面就是接線操作了
//尾節點tail的本來是指node的
//為了把node挪出來,tail指向node的下一節點node->next,防止丟失
tail->next=node->next;
//node->next不用指向原本的下一節點了
//此時compare->next指向的是比node大的數,所以node開始認compare->next做老大哥
//node->next接上了老大哥compare->next,和原本的位置撇清了關係
node->next=compare->next;
//比node小的compare地位迅速降低,淚目
//只能乖乖接上老二哥node,也只敢通過node和原本的大哥compare->next聯絡
//如此一來,node就成功混進兩者之間
compare->next=node;
//node掌握別的值,又開始新一輪的接線操作,一場腥風血雨又在醞釀(可以出本書了)
node=tail->next;
}
//dummyHead連結串列的表頭,dummyHead->next會指向連結串列的第一個節點
return dummyhead->next;
}
如有錯誤,還望指正,十分感謝!
走了點彎路,看了一些大佬的程式碼,就很很順了,最大的收穫是對連結串列更熟悉了,有空寫個連結串列相關的專案鞏固一下
題目來源:
力扣(LeetCode)
題目連結:
https://leetcode-cn.com/problems/insertion-sort-list