【链表 - 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;
    }
};
相关推荐
Greedy Alg1 小时前
LeetCode 239. 滑动窗口最大值
数据结构·算法·leetcode
闪电麦坤952 小时前
数据结构:排序算法的评判标准(Criteria Used For Analysing Sorts)
数据结构·算法·排序算法
爱coding的橙子2 小时前
每日算法刷题Day65:8.27:leetcode dfs11道题,用时2h30min
算法·leetcode·深度优先
浩少7027 小时前
LeetCode-22day:多维动态规划
算法·leetcode·动态规划
岁月静好20258 小时前
Leetcode 深度优先搜索 (15)
算法·leetcode·深度优先
离越词9 小时前
C++day1作业
数据结构·c++·算法
凤年徐9 小时前
【数据结构与算法】LeetCode 20.有效的括号
c语言·数据结构·算法·leetcode
道剑剑非道10 小时前
VxWorks 核心数据结构详解 【消息队列、环形缓冲区、管道、FIFO、双缓冲区、共享内存】
数据结构·c·vxworks
东皇太星11 小时前
模运算(密码学/数论/算法)
数据结构·算法·密码学