1. 程式人生 > 其它 >力扣 題目25-- K 個一組翻轉連結串列

力扣 題目25-- K 個一組翻轉連結串列

題目


題解


 

我們先想一下如果把整個連結串列翻轉的應該怎麼做?

是不是可以用棧去存放連結串列的每一個節點地址 如果再取頂即可

同理 我們可以把每k個節點當作一個連結串列 然後進行反轉  然後連線他們

顯而易見可以使用遞迴法 返回的就是每一個連結串列的頭結點 然後用每一個連結串列的最後一個結點的next接收 這樣所有的連結串列就能連線

至於結束條件 題目中這樣寫到

如果節點總數不是 的整數倍,那麼請將最後剩餘的節點保持原有順序。

那麼我們需要判斷一下

 

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) {}
11 }; 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 }
View Code