【链表 - LeetCode】25. K 个一组翻转链表

25. K 个一组翻转链表 - 力扣(LeetCode)

题解

递归解法

cpp 复制代码
/**
 * 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) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if (head == nullptr) return nullptr;
        ListNode* prev = head;
        ListNode* index = head->next;
        int m = 0;
        // 考虑每k个情况,单链表反转
        while (++m < k && index != nullptr) {
            prev->next = index->next;
            index->next = head;
            head = index;
            index = prev->next;
        }
        if (m < k) {
            return reverseKGroup(head, m);
        }
        // 注意这里是index,即下一组的头
        prev->next = reverseKGroup(index, k);
        return head;
    }
};

迭代

cpp 复制代码
/**
 * 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) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
       ListNode* dummy = new ListNode(0, head);
       ListNode* prev = dummy;
       ListNode* cur = head;
       int n = 0; // 链表长度
       while(cur != nullptr){
            n ++;
            cur = cur->next;
       }
       n = n / k;
       cur = head;
       for(int i = 1; i <= n *(k-1); i++){
            ListNode* nxt = cur->next;
            cur->next = nxt->next;
            nxt->next = prev->next;
            prev->next = nxt;
            if(i % (k-1) == 0){
                prev = cur;
                cur = cur->next;
            }
       }
       return dummy->next;
    }
};
相关推荐
DanyHope3 分钟前
LeetCode 128. 最长连续序列:O (n) 时间的哈希集合 + 剪枝解法全解析
前端·leetcode·哈希算法·剪枝
元亓亓亓6 分钟前
LeetCode热题100--763. 划分字母区间--中等
算法·leetcode·职场和发展
Dream it possible!6 分钟前
LeetCode 面试经典 150_回溯_全排列(100_46_C++_中等)
c++·leetcode·面试·回溯
鹿角片ljp7 分钟前
力扣206.反转链表-双指针法(推荐)
算法·leetcode·链表
LYFlied23 分钟前
【每日算法】LeetCode 70. 爬楼梯:从递归到动态规划的思维演进
算法·leetcode·面试·职场和发展·动态规划
一起养小猫23 分钟前
LeetCode100天Day2-验证回文串与接雨水
java·leetcode
YoungHong199226 分钟前
面试经典150题[073]:从中序与后序遍历序列构造二叉树(LeetCode 106)
leetcode·面试·职场和发展
业精于勤的牙30 分钟前
浅谈:算法中的斐波那契数(五)
算法·leetcode·职场和发展
液态不合群33 分钟前
查找算法详解
java·数据结构·算法
LYFlied1 小时前
【每日算法】LeetCode 105. 从前序与中序遍历序列构造二叉树
数据结构·算法·leetcode·面试·职场和发展