面試題02.04.分割連結串列
阿新 • • 發佈:2020-12-13
現有一連結串列的頭指標 ListNode*pHead,給一定值x,編寫一段程式碼將所有小於x的結點排在其餘結點之前,且不能改變原來的資料順序,返回重新排列後的連結串列的頭指標。連結串列為無頭結點、單向、不迴圈。(由於涉及到結構體,所以寫不了完整的測試程式碼,下面展示的程式碼為牛客網中寫的程式碼)
//第一次嘗試:
//雙指標法,先建立兩個虛頭節點max、min,用來存放分好類的資料,遍歷連結串列,如果大於等於x,就將結點尾插入max後,如果小於就尾插入min後最後讓min的尾結點指向max頭結點的下一個
// 因為我們這裡是建立了虛頭結點的,所以要將他排除在外
struct ListNode* partition(structListNode* head, int x){ if(head == NULL||head->next == NULL){ return head; }
//兩個虛頭結點 struct ListNode min;struct ListNode max; min.next = NULL;max.next = NULL; struct ListNode* pmin = &min;struct ListNode* pmax = &max;
//判斷資料大小,然後分別尾插入對應的連結串列中 while(head){if(head->val < x){ pmin->next = head; pmin = pmin->next; } else{ pmax->next = head; pmax = pmax->next; } head = head->next; }
//連結min和max pmax->next = NULL;
//這裡要注意除去虛頭結點 pmin->next = max.next;
//返回的時候也要注意,將虛頭結點排除在外return min.next; }