力扣 題目25-- K 個一組翻轉連結串列
阿新 • • 發佈:2022-04-13
題目
題解
我們先想一下如果把整個連結串列翻轉的應該怎麼做?
是不是可以用棧去存放連結串列的每一個節點地址 如果再取頂即可
同理 我們可以把每k個節點當作一個連結串列 然後進行反轉 然後連線他們
顯而易見可以使用遞迴法 返回的就是每一個連結串列的頭結點 然後用每一個連結串列的最後一個結點的next接收 這樣所有的連結串列就能連線
至於結束條件 題目中這樣寫到
如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。
那麼我們需要判斷一下
1.在將連結串列放入棧時 在k次迴圈中連結串列是否為NULL 是則直接輸出 head即可
2.連結串列為空和k=1 直接輸出 head即可
程式碼
1 #include<iostream> 2 #include<vector> 3 #include<stack> 4 using namespace std; 5 struct ListNode { 6 int val; 7 ListNode* next; 8 ListNode() : val(0), next(nullptr) {} 9 ListNode(int x) : val(x), next(nullptr) {} 10 ListNode(int x, ListNode* next) : val(x), next(next) {}View Code11 }; 12 13 class Solution { 14 public: 15 ListNode* reverseKGroup(ListNode* head, int k) { 16 //連結串列為空和k=1 直接輸出 head即可 17 if (head==nullptr||k == 1) { 18 return head; 19 } 20 ListNode* list1 = head; 21 ListNode* result; 22 stack<ListNode*> reversal;23 //將連結串列放入棧 24 for (int i = 0; i < k; i++) { 25 //在k次迴圈中連結串列是否為NULL 是則直接輸出head即可 26 if (list1 == nullptr) { 27 return head; 28 } 29 reversal.push(list1); 30 list1 = list1->next; 31 } 32 //先把頭結點賦值 33 result = reversal.top(); 34 ListNode* list = result; 35 reversal.pop(); 36 //然後再考慮剩下的 37 while (!reversal.empty()) 38 { 39 result->next = reversal.top(); 40 result = result->next; 41 reversal.pop(); 42 } 43 //找連結串列的下一個 44 result->next = reverseKGroup(list1, k); 45 return list; 46 } 47 }; 48 void listnum(ListNode& list, vector<int>& vectorlist) { 49 ListNode* headlist = &list; 50 for (int i = 0; i < vectorlist.size(); i++) { 51 ListNode* p; 52 p = (struct ListNode*)malloc(sizeof(struct ListNode*)); 53 p->val = vectorlist[i]; 54 headlist->next = p; 55 headlist = headlist->next; 56 } 57 headlist->next = NULL; 58 } 59 int main() { 60 Solution sol; 61 ListNode list1(1); 62 vector<int> vectorlist1 = { 2,3,4,5,6 }; 63 listnum(list1, vectorlist1); 64 ListNode* list = sol.reverseKGroup(&list1,2); 65 for (int i = 0; list != NULL; i++) { 66 cout << list->val << endl; 67 list = list->next; 68 } 69 }