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;
    }
}
相关推荐
I_LPL1 小时前
hot100贪心专题
数据结构·算法·leetcode·贪心
颜酱2 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
发现一只大呆瓜2 小时前
React-彻底搞懂 Redux:从单向数据流到 useReducer 的终极抉择
前端·react.js·面试
WolfGang0073212 小时前
代码随想录算法训练营 Day16 | 二叉树 part06
算法
零雲2 小时前
java面试:了解抽象类与接口么?讲一讲它们的区别
java·开发语言·面试
uzong3 小时前
Skill 被广泛应用,到底什么是 Skill,今天详细介绍一下
人工智能·后端·面试
发现一只大呆瓜3 小时前
React-路由监听 / 跳转 / 守卫全攻略(附实战代码)
前端·react.js·面试
2401_831824963 小时前
代码性能剖析工具
开发语言·c++·算法
Sunshine for you4 小时前
C++中的职责链模式实战
开发语言·c++·算法
qq_416018724 小时前
C++中的状态模式
开发语言·c++·算法