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

力扣——25 K个一组翻转链表

目录

1.题目描述:

2.算法分析:

3.代码展示:


1.题目描述:

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

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

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

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

示例 2:

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

2.算法分析:

  1. 计算链表长度​​:

    • 首先遍历整个链表,统计节点的总数 n。这是为了知道有多少组 k 个节点需要反转。
  2. ​初始化辅助指针​​:

    • 使用一个虚拟头节点 dummy 可以简化操作,尤其是在处理头节点的反转时。
    • p 用于记录当前待反转子链表的前一个节点。
    • pre 和 cur 用于反转子链表。
  3. ​分组反转​​:

    • 只要剩余的节点数 n 大于等于 k,就进行反转:
      • 反转连续的 k 个节点:
        • 使用类似反转单链表的方法,逐个反转节点。
      • 调整连接:
        • 将反转后的子链表与前面的部分连接起来。
        • 将反转后的子链表的尾部与下一个子链表的头部连接。
        • 移动 p 到下一个待反转子链表的前一个节点。
  4. ​处理剩余节点​​:

    • 如果剩余的节点数不足 k,则不进行反转,直接保留原顺序。
  5. ​返回结果​​:

    • 由于 dummy 的 next 始终指向链表的头节点,因此返回 dummy->next

示例

假设链表为 1 -> 2 -> 3 -> 4 -> 5k = 2

  1. 计算长度 n = 5
  2. dummy -> 1 -> 2 -> 3 -> 4 -> 5
  3. 第一组反转 1 和 2
    • 反转后:2 -> 1cur 指向 3
    • 调整连接:dummy -> 21 -> 3
    • p 移动到 1
  4. 第二组反转 3 和 4
    • 反转后:4 -> 3cur 指向 5
    • 调整连接:1 -> 43 -> 5
    • p 移动到 3
  5. 剩余 n = 1,不足 k,不反转。
  6. 最终链表:2 -> 1 -> 4 -> 3 -> 5

3.代码展示:

ListNode* reverseKGroup(ListNode* head, int k) {int n = 0; // 代表节点的个数// 计算出链表节点的个数for (ListNode* cur = head; cur; cur = cur->next) {n++;}// 创建一个空节点,便于后续的操作ListNode* dummy = new ListNode(0, head);ListNode* p = dummy;ListNode* pre = nullptr;ListNode* cur = head;for (; n >= k; n-=k) {for (int i = 0; i < k; i++) {// 进行翻转操作ListNode* nex = cur->next;cur->next = pre;pre = cur;cur = nex;}if (p->next == nullptr) {return 0;}ListNode* temp = p->next;p->next->next = cur;p->next = pre;p = temp;}return dummy->next;}

25. K 个一组翻转链表 - 力扣(LeetCode)https://leetcode.cn/problems/reverse-nodes-in-k-group/

http://www.xdnf.cn/news/4491.html

相关文章:

  • 写个远程操作Android的调试程序
  • 【Linux篇】多线程编程中的互斥与同步:深入理解锁与条件变量的应用
  • Nginx 性能调优与深度监控
  • 7. HTML 表格基础
  • 第三章、RL Games:High performance RL library
  • femap许可回收流程
  • mysql修改root密码
  • 东方泵业,室外消火栓泵 2#故障灯亮,报警生响
  • 蓝桥杯2025年第十六届省赛真题-水质检测
  • 【shardingsphere分布式主键无效】
  • Linux 系统命令使用指南1
  • 2025最新出版 Microsoft Project由入门到精通(二)
  • WPF 触发器 Trigger
  • java每日精进 5.07【框架之数据权限】
  • 【C++游戏引擎开发】第33篇:物理引擎(Bullet)—射线检测
  • 小数的二进制表示
  • 【卡特兰数】不同的二叉搜索树
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.3.30)
  • (25.05)Ubuntu 20.04上安装和运行ORB-SLAM3(非ROS)
  • 操作指南*
  • 数通HCIE的通过率怎么样?
  • no main manifest attribute, in xxx.jar
  • 软件系统的可观测性 Observability
  • 【AI】模型与权重的基本概念
  • 《Python星球日记》 第45天:KNN 与 SVM 分类器
  • 从电话到V信语音:一款App实现全场景社交脱身
  • 28.成功解决i2c_transfer返回-6的问题并linux驱动mpu6050(适合一切linux学习者)
  • OpenCV 中用于背景分割(背景建模)的一个类cv::bgsegm::BackgroundSubtractorCNT
  • 【HarmonyOS 5】鸿蒙中常见的标题栏布局方案
  • Oracle 开窗函数