算法日常・每日刷题--<链表>5
2026/7/28 2:47:09 网站建设 项目流程

25. K 个一组翻转链表 - 力扣(LeetCode)25. K 个一组翻转链表 - 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例 1:[https://assets.leetcode.com/uploads/2020/10/03/reverse_ex1.jpg]输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]示例 2:[https://assets.leetcode.com/uploads/2020/10/03/reverse_ex2.jpg]输入:head = [1,2,3,4,5], k = 3输出:[3,2,1,4,5] 提示: * 链表中的节点数目为 n * 1 <= k <= n <= 5000 * 0 <= Node.val <= 1000 进阶:你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?https://leetcode.cn/problems/reverse-nodes-in-k-group/

题目描述

给你链表的头节点head,每k个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。

⚠️ 要求:不能仅交换节点内部数值,必须调整节点指针完成翻转。

示例: 输入链表:1 → 2 → 3 → 4 → 5k=2输出链表:2 → 1 → 4 → 3 → 5

思路分析

本篇带来一种非常直观的实现方案:预先统计链表长度 + 头插法分组翻转。整体流程分为 4 步:

  1. 统计链表总节点数量:遍历一次链表,算出一共多少个节点;
  2. 计算可完整翻转组数组数 = 总节点数 / k,不足 k 个的尾部节点不翻转;
  3. 虚拟头结点 + 头插法:逐组翻转 k 个节点;
  4. 组间衔接:每组翻转完成后,更新前驱指针,循环结束拼接剩余节点。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { ListNode*newhead=new ListNode(0); ListNode* prev,*cur; prev=newhead; prev->next=NULL; int n=0; cur=head; while(cur) { n++; cur=cur->next; } n=n/k; cur=head; while(n--) { //实现链表逆序的操作 ListNode* tmp=cur; for(int i=0;i<k;i++) { ListNode* next=cur->next; cur->next=prev->next; prev->next=cur; cur=next; } prev=tmp; } prev->next=cur; cur=newhead->next; delete newhead; return cur; } };

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询