当前位置: 首页 > news >正文

(每日一道算法题) K 个一组翻转链表

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

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

提示:

  • 链表中的节点数目为 n
  • 1 <= k <= n <= 5000
  • 0 <= Node.val <= 1000

 

解法思路

步骤分析

  1. 计算链表长度:首先遍历链表,得到总长度 n,确定需要翻转的组数 m = n / k
  2. 虚拟头节点:创建一个虚拟头节点,简化头节点翻转后的连接处理。
  3. 分组翻转:对每个分组进行头插法翻转,逐个将节点插入到前驱节点之后,形成逆序。
  4. 连接各组:每完成一组翻转后,更新前驱指针到当前组的末尾,以便连接下一组。
  5. 处理剩余节点:将剩余不足 k 个的节点直接连接到已处理部分的末尾。

关键点

  • 头插法翻转:对于每组节点,通过将每个节点插入到前驱节点之后,实现逆序。
  • 前驱指针更新:每完成一组翻转后,前驱指针移动到当前组的末尾,保持后续连接的正确性。

代码解析

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        int n = 0;
        ListNode cur = head;
        while (cur != null) { // 计算链表总长度
            cur = cur.next;
            n++;
        }
        int m = n / k; // 需要翻转的组数
        
        ListNode dummy = new ListNode(-1); // 虚拟头节点
        ListNode prev = dummy;
        cur = head;
        ListNode tmp = null;
        
        for (int i = 0; i < m; i++) { // 处理每组
            tmp = cur; // 保存当前组的第一个节点,翻转后变为末尾
            for (int j = 0; j < k; j++) { // 头插法翻转当前组
                ListNode next = cur.next;
                cur.next = prev.next; // 当前节点插入到prev之后
                prev.next = cur;
                cur = next;
            }
            prev = tmp; // 前驱指针移动到当前组末尾
        }
        prev.next = cur; // 连接剩余节点
        return dummy.next;
    }
}

 

复杂度分析

  • 时间复杂度:O(n),其中 n 为链表长度。遍历链表计算长度耗时 O(n),翻转每组节点耗时 O(n)。
  • 空间复杂度:O(1),仅使用常数级别的额外空间。

总结

本解法通过头插法实现每组的翻转,利用虚拟头节点简化连接逻辑,通过前驱指针维护各组之间的连接。思路清晰,代码简洁高效。适用于对链表操作较为熟悉的开发者,重点在于理解头插法的翻转逻辑和指针的更新策略。

http://www.dtcms.com/a/92532.html

相关文章:

  • 2025宠物智能喂养设备全栈开发方案:Python驱动的高效实现路径
  • IntelliJ IDEA创建Maven工程
  • Ardupilot开源无人机之Geek SDK进展2025Q2
  • 我的世界1.20.1forge模组进阶开发教程——结构(3)
  • 华为 eNSP 链路聚合:从面试问题到实战解析
  • MySQL数据库精研之旅第四期:解锁库操作高阶技能
  • Python数据可视化与数据处理全解析:Matplotlib图形控制与Pandas高效数据分析实战
  • MySQL中的Redo Log、Undo Log和Binary Log
  • 大模型在支气管肺癌预测及临床决策中的应用研究报告
  • 蓝桥杯 临时抱佛脚 之 二分答案法与相关题目
  • 【设计模式】抽象工厂模式(含与工厂方法模式的对比)
  • Unity-RectTransform设置UI width
  • wokwi arduino mega 2560 - 模数与数模转换AD和DA
  • 设置git拉取的文件换行格式
  • Codeforces Round 1013 (Div. 3)
  • 企业入驻成都国际数字影像产业园,可享150多项专业服务
  • AwesomeQt分享(含源码)
  • Leetcode 路径总和 III
  • 振弦采集读数仪 智能型 支持振弦、温度、电压、电流测量,无线传输 自动化操作 适用地质灾害与土木工程监测
  • Java条码与二维码生成技术详解
  • 3.2 罗必达法则
  • 23种设计模式-状态(State)设计模式
  • Vala编成语言教程-构造函数和析构函数
  • SQL注入零基础学习二MYSQL手工注入
  • 23种设计模式中的中介者模式
  • 腾讯pcg客户端一面
  • 【移动应用开发】任务4 创建系统主界面
  • 【AVRCP】深度解析蓝牙高速(AMP)在封面艺术传输中的应用:低延迟体验的工程实践
  • java使用小知识合集(持续更新中)
  • etcd性能测试