1. 程式人生 > 其它 >LeetCode中等題:147. 對連結串列進行插入排序(使用C語言)

LeetCode中等題:147. 對連結串列進行插入排序(使用C語言)

技術標籤:C語言連結串列單鏈表指標c語言

對連結串列進行插入排序。
圖源LeetCode147. 對連結串列進行插入排序

插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。

插入排序演算法:

插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
重複直到所有輸入資料插入完為止。

示例 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