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;
    }
}
相关推荐
青少儿编程课堂7 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
时间的拾荒人25 分钟前
Redis 集合类型详解:Set 与 Zset
redis·缓存·面试
wo_jack2 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
Oneshot2 小时前
DLX(Dancing Links)算法详解:求解数独最快的算法
算法
文丑颜不良啊2 小时前
LeetCode2541~2560题目解析
java·leetcode
青少儿编程课堂3 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
kongdong3 小时前
Hikyuu | RSI均值回归交易策略实现
算法·均值算法·回归·量化交易·交易策略·hikyuu
Rain的Java大神之路3 小时前
设计一套生产级 API 接口:从契约、安全、幂等到限流,我踩过的坑都在这了
java·后端·面试
小王C语言3 小时前
优选算法:分治-归并排序
算法
小南家的青蛙4 小时前
微服务体系下DevOps运维岗位面试方案设计
运维·面试·职场和发展·devops