day39(12.20)——leetcode面试经典150

25. K 个一组翻转链表

25. K个一组翻转链表

这题有点难啊啊啊啊,怎么会有人能这样想到,这也太聪明了吧啊啊啊

题目:

题解:

java 复制代码
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null || k <= 1) return head;

        // Step 1: 创建虚拟头节点
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode prev = dummy; // prev 始终指向当前组的前一个节点

        // Step 2: 计算链表总长度(可选,也可以在每轮检查 k 个节点)
        int length = 0;
        ListNode cur = head;
        while (cur != null) {
            length++;
            cur = cur.next;
        }

        // Step 3: 处理 fullGroups = length / k 个完整组
        int fullGroups = length / k;
        for (int i = 0; i < fullGroups; i++) {
            // start 是当前组的第一个节点
            ListNode start = prev.next;
            // then 是 start 的下一个,即将被"头插"的节点
            ListNode then = start.next;

            // 执行 k-1 次头插操作
            for (int j = 0; j < k - 1; j++) {
                // 1. start 跳过 then,连到 then 的下一个
                start.next = then.next;
                // 2. then 插到 prev 后面
                then.next = prev.next;
                prev.next = then;
                // 3. then 移动到下一个待处理节点
                then = start.next;
            }

            // 一轮反转结束,prev 移动到本组的最后一个节点(即原来的 start)
            prev = start;
        }

        return dummy.next;
    }
}
相关推荐
疯狂的喵3 小时前
C++编译期多态实现
开发语言·c++·算法
scx201310043 小时前
20260129LCA总结
算法·深度优先·图论
2301_765703143 小时前
C++中的协程编程
开发语言·c++·算法
m0_748708053 小时前
实时数据压缩库
开发语言·c++·算法
小魏每天都学习3 小时前
【算法——c/c++]
c语言·c++·算法
智码未来学堂4 小时前
探秘 C 语言算法之枚举:解锁解题新思路
c语言·数据结构·算法
Halo_tjn4 小时前
基于封装的专项 知识点
java·前端·python·算法
春日见4 小时前
如何避免代码冲突,拉取分支
linux·人工智能·算法·机器学习·自动驾驶
副露のmagic4 小时前
更弱智的算法学习 day59
算法
u0109272715 小时前
C++中的RAII技术深入
开发语言·c++·算法