Leetcode 25. K 个一组翻转链表

ops/2024/10/18 10:16:10/

题目链接:

25. K 个一组翻转链表 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-nodes-in-k-group/description/


题目:

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

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

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

例:

例1:

412821b2b90b4efa976a0194be8c96fe.png

 输入:

        head = [1,2,3,4,5], k = 2

输出:首先

        [2,1,4,3,5]

例2:

d99fb08b4a7e43208f8b0623cba2b96b.png

输入:

        head = [1,2,3,4,5], k = 3

 输出:

        [3,2,1,4,5]

提示:

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


思路:

这是LeetCode一道困难题。

首先读题,题目要求没k个链表节点就翻转一次,当剩下的节点数量少于k时,不做任何处理。

那我们可以按k个链表节点进行处理,使用递归翻转链表

因为每次翻转链表后,第一个链表节点一定是翻转后k个链表的尾节点,所以定义一个链表指针tail指向head(即第一个需要翻转的链表节点)。

在翻转中,我们可以每次都将最后一个链表翻转至第一个,但是每次翻转后,由于是单向链表,所以无法找到前一个链表节点的地址。所以我们使用一个vector(变长数组)来存储k个链表节点的地址。在存储链表的过程中,若当前节点指向了NULL,意味着到了最后一个节点,此时若变长数组中节点数量不足k个时,直接返回头结点即可。满足则继续下一步。

接下来为了保护下一个k组能成功翻转,使用一个next指针指向翻转前最后一个链表的下一个链表

接下来对变长数组中的k个节点进行处理,让最后一个节点成为k个节点翻转后的头结点,然后按照数组中的逆序进行连接链表,然后让最后一个节点指向下一次函数返回的头结点。

最后返回当前k组节点翻转后的头结点即可。


AC代码:

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* resereve(ListNode* head, int k) {if (head == nullptr || k == 0) {return head;}vector<ListNode*> arr;ListNode* tail = head;for (int i = 1; i < k; i++) {arr.push_back(tail);tail = tail->next;if (tail == nullptr) {return head;}}arr.push_back(tail);ListNode* next = tail->next;ListNode* last;int now = arr.size() - 2;while (now >= 0) {arr[now]->next = tail->next;tail->next = arr[now];tail = tail->next;now--;}tail->next = resereve(next, k);return arr[k - 1];}ListNode* reverseKGroup(ListNode* head, int k) {return resereve(head, k);}
};

如果我的文章对你有所帮助,不妨给我个关注何点赞吧。


http://www.ppmy.cn/ops/15619.html

相关文章

NIKKE胜利女神妮姬1.5周年(PC)怎么注册?账号注册教程一看就懂

游戏的世界观了一些轻科幻、末世和废土背景&#xff0c;剧情中也探讨了一些深刻的主题&#xff0c;比如NIKKE的人权问题。虽然整体剧情表现得连贯&#xff0c;但本质上有一些俗套情节&#xff0c;特别是在序章的玛丽安之死后&#xff0c;剧情逐渐失去了原有的紧张感&#xff0c…

C#创建netcore配置program文件

记录一下 .Net Core 6 WebApi 项目搭建_.net core webapi-CSDN博客 .NET6 JWT(生成Token令牌) 且在swagger添加JWT - 陌麟 - 博客园 (cnblogs.com) 如何在 Net6.0 中对 WebAPI 进行 JWT 认证和授权 - 可均可可 - 博客园 (cnblogs.com) ASP.NET Core 6.0 添加 JWT 认证和授…

基于Springboot的新生宿舍管理系统

基于SpringbootVue的新生宿舍管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 公告信息管理 院系管理 班级管理 学生管理 宿舍信息管理 宿舍安排管理…

【CMU15-445 Part-20】Logging Scheme

Part20-Logging Schemes commit 一般就意味着 持久化到disk。 logging recovery 是保证txn所做的修改能够保障数据库的一致性、事务的原子性&#xff0c;持久性&#xff0c;关心的是acid中的acd。 恢复协议其实是两部分&#xff1a;1. 确保系统运行中遇到故障后可以恢复的措…

Linux:进程创建 进程终止

Linux&#xff1a;进程创建 & 进程终止 进程创建fork写时拷贝 进程终止退出码strerrorerrno 异常信号exit 进程创建 fork fork函数可以用于在程序内部创建子进程&#xff0c;其包含在头文件<unistd.h>中&#xff0c;直接调用fork()就可以创建子进程了。 示例代码&…

星域社区原版APP源码/社区交友App源码/动态圈子群聊php源码

简介 初始版本是由RuleAPP规则之树开发的&#xff0c;而星域社区则是在此基础上进行了二次开发和美化。作者花了近一年的时间来打磨它&#xff0c;现在即将推出Pro版。如果你只想免费使用的话&#xff0c;可以使用原始的RuleAPP版本。但是&#xff0c;如果你想要获得更好的美观…

操作符不存在:sde.st_geometry ^ !sde.st_geometry建议 SQL函 数st_intersects在内联inlining期间

操作符不存在&#xff1a;sde.st_geometry ^ &#xff01;sde.st_geometry建议 SQL函 数st_intersects在内联inlining期间 问题&#xff1a;最近在使用SQL图形处理函数处理图形时&#xff0c;莫名奇妙报如下错误&#xff0c;甚是费解 于是开始四处"寻医问药" 1、nav…

每周一算法:最短路计数

题目描述 给出一个 N N N个顶点 M M M 条边的无向无权图&#xff0c;顶点编号为 1 1 1 到 N N N。 问从顶点 1 1 1 开始&#xff0c;到其他每个点的最短路有几条。 输入格式 第一行包含 2 2 2 个正整数 N , M N,M N,M&#xff0c;为图的顶点数与边数。 接下来 M M …