1. 程式人生 > 其它 >Leetcode 25 K個一組翻轉連結串列

Leetcode 25 K個一組翻轉連結串列

技術標籤: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;
    }
};

提交結果