Leetcode 25 K個一組翻轉連結串列
阿新 • • 發佈:2021-02-14
技術標籤:Leetcode每日打卡_每日一道leetcode演算法資料結構
Leetcode 25 K個一組翻轉連結串列
題目描述
給你一個連結串列,每 k 個節點一組進行翻轉,請你返回翻轉後的連結串列。
k 是一個正整數,它的值小於或等於連結串列的長度。
如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。
來源:力扣(LeetCode)題目連結
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
題解1(棧)
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* dummy = new ListNode;
ListNode* temp = new ListNode;
temp = dummy;
stack<ListNode*> stacks;
while(head){
for(int i = 0; i < k; i++){
if (! head) return dummy->next;
stacks.push(head);
head = head->next;
}
while(!stacks.empty()){
temp->next = stacks.top();
stacks.pop();
temp = temp->next;
}
//防止不足k個
temp->next = head;
}
return dummy->next;
}
};
題解2(遞迴)
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if(! head || k < 2) return head;
int c = 1;
ListNode* cc = head;
while(c < k && cc){
c++;
cc = cc->next;
}
if(! cc) return head;
ListNode* dummy = cc->next;
//下一組
ListNode* prev = reverseKGroup(dummy, k);
ListNode* cur, *nex;
cur = head;
//逆序拆解過程
//1->2->3->4 k = 3
//1->4 --> 2->1 --> 3->2
while(cur != dummy){
nex = cur->next;
cur->next = prev;
prev = cur;
cur = nex;
}
return cc;
}
};