LeetCode 25. K 个一组翻转链表

news2025/2/27 4:58:14

原题链接

难度: h a r d \color{red}{hard} hard

题目描述

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

k k k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 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]
复制示例输入

提示:

  • 链表中的节点数目为 n n n
  • 1 < = k < = n < = 5000 1 <= k <= n <= 5000 1<=k<=n<=5000
  • 0 < = N o d e . v a l < = 1000 0 <= Node.val <= 1000 0<=Node.val<=1000

进阶: 你可以设计一个只用 O ( 1 ) O(1) O(1) 额外内存空间的算法解决此问题吗?


算法

(模拟)

  1. 增加虚拟头结点 dummy,并且令 cur 指针指向 dummy。
  2. 对于每一轮的修改,令 first 指针为 cur->next,并求出 end 指针为下一轮需要交换的最后一个结点;在找 end 的过程中,若不足 k 个结点,则直接终止循环。
  3. 在找到 first 和 end 后,设置 p1 和 p2 两个指针修改相邻结点之间的连接关系,需要一个临时的 new_p2 指针。(参考代码)
  4. 最终修改 cur->next 和 first->next。
  5. 令 cur 指向下一轮修改的起始位置的前一个位置。

C++ 代码

/**
 * 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* dummy = new ListNode(0, head);
        ListNode* cur = dummy;

        while (cur != NULL) {
            ListNode* first = cur -> next;
            ListNode* end = cur;
            //find the end position
            for (int i = 0; i < k && end != NULL; i ++)
                end = end->next;

            if (end == NULL) break;

            ListNode* p1 = first;
            ListNode* p2 = first->next;

            while (p1 != end) {
                ListNode *new_p2 = p2->next;
                p2->next = p1;
                p1 = p2;
                p2 = new_p2;
            }

            first->next = p2;
            cur->next = end;
            cur = first;
        }

        return dummy->next;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue2配置cesium详细教程

1.简介 网络上现在关于vue配置cesium的教程有很多&#xff0c;包括csdn和掘金等。虽然这些教程在一定意义上提供了开发者如何配置cesium的方法&#xff0c;但是大部分的方法都不切实际&#xff0c;因为每个人的电脑中npm、node、cesium、vue、webpack的版本都基本不一致的&…

汽车直营模式下OTD全流程

概述 随着新能源汽车的蓬勃发展&#xff0c;造车新势力的涌入&#xff0c;许多新能源车企想通过直营的营销模式来解决新能源汽车市场推广速度缓慢问题&#xff0c;而直营模式下OTD&#xff08;Order-To-Delivery&#xff0c;订单-交付&#xff09;全流程的改革创新在这过程中无…

高压放大器在非线性超声传播研究中的应用

实验名称&#xff1a;高压放大器在非线性超声传播研究中的应用研究方向&#xff1a;超声波测试目的&#xff1a;超声波在混凝土中的传播是一个极为复杂的非线性过程。当超声波穿过混凝土材料时&#xff0c;携带了大量有关混凝土内部结构和构造的信息。传统的超声波检测方法虽然…

Android13通知运行时权限

部分应用更新到Android13以上之后&#xff0c;没有横幅(在屏幕上弹出)通知了。 Android 13&#xff08;API 级别 33&#xff09;及更高版本支持用于从应用发送非豁免&#xff08;包括前台服务 [FGS]&#xff09;通知的运行时权限&#xff1a;POST_NOTIFICATIONS。此更改有助于…

死锁(5.1)

死锁 1 死锁的基本概念 1.1 死锁的定义 死锁是发生在一组相互合作或竞争的线程或进程中的一个问题。因此可以定义为&#xff1a;一组竞争系统资源或相互通信的进程相互的“永久”阻塞。若无外力作用&#xff0c;这组进程将永远不能继续执行。 1.2死锁产生的原因进程 &…

第四章 统计机器学习

机器学习&#xff1a;从数据中学习知识&#xff1b; 原始数据中提取特征&#xff1b;学习映射函数f&#xff1b;通过映射函数f将原始数据映射到语义空间&#xff0c;即寻找数据和任务目标之间的关系&#xff1b; 机器学习&#xff1a; 监督学习&#xff1a;数据有标签&#x…

基于Java实现的商品出入库管理系统

基于Java实现的商品出入库管理系统&#xff08;文末附源码&#xff09; 前言 一、出入库管理系统含义介绍&#xff1a; 出入库管理系统是一套利用一物一码技术对仓库货物各环节实施全过程控制管理的系统&#xff0c;可对仓库货物进行入库、出库、货位、批次、保质期等实现一…

DDL 数据定义语言

DDL 数据定义语言 目录概述一、库的管理1、库的创建2、库的修改【一般不修改&#xff0c;容易出现错误】3、库的删除二、表的管理【重要】1、表的创建2、表的修改3、表的删除4、表的复制 【可以跨库复制】练习题概述 数据定义语言 库和表的管理 一、库的管理 创建、修改、删除…

分享116个HTML电子商务模板,总有一款适合您

分享116个HTML电子商务模板&#xff0c;总有一款适合您 116个HTML电子商务模板下载链接&#xff1a;https://pan.baidu.com/s/1gaff8RsoYUD_ep0ejhGkMw?pwdzby2 提取码&#xff1a;zby2 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 建筑行业电子商务模板 建…

2.1单区域集成IS-IS

2.2.1 实验一:单区域集成IS-IS 实验目的实现IS-IS协议基本配置实验拓扑配置单区域集成IS-IS的拓扑图如图2-4所示: 图2-4:配置单区域集成IS-IS 实验步骤配置IP地址R1的配置 <Huawei>system-view

MySQL必会四大函数-窗口函数

在了解窗口函数之前&#xff0c;我们必须了解聚合函数。常见的聚合函数&#xff0c;包括 AVG、COUNT、MAX、MIN、SUM 以及 GROUP_CONCAT&#xff0c;常和GROUP BY 函数一起使用。聚合函数的作用就是对一组数据行进行汇总计算&#xff0c;并且返回单个分析结果。 窗口函数和聚合…

用最新版 VoxEdit 来提升你们的创造力!

众所周知&#xff0c;VoxEdit 可以为你们提供 Voxel 资产建模、装配和制作动画并与全世界分享的一站式服务&#xff0c;而这些全都是免费的。我们一直倾听社区意见并希望让所有人都能更容易进入 The Sandbox 元宇宙。VoxEdit 最新更新版本已经推出&#xff01;为了软体更本土化…

MySQL的触发器

目录 一.概述 介绍 触发器的特性 操作—创建触发器 操作—new和old 操作—查看触发器 操作—删除触发器 注意事项 一.概述 介绍 触发器&#xff0c;就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段&#xff0c;但是…

MACD红二波选股公式,选出MACD二次翻红的标的

经过一段上涨行情之后&#xff0c;市场出现了时间稍长或者幅度稍大的调整&#xff0c;MACD指标的DIF、DEA会出现死叉&#xff0c;柱线由红色转变为绿色。 而调整时间较短或者幅度较小&#xff0c;MACD红柱会缩短&#xff0c;但不出现绿柱&#xff0c;之后红柱开始变长&#xff…

Python-第六天 Python数据容器

Python-第六天 Python数据容器一、数据容器入门1.数据容器二、数据容器&#xff1a;list(列表)1.列表的定义2.列表的下标&#xff08;索引&#xff09;3.列表的常用操作&#xff08;方法&#xff09;4.练习案例:常用功能练习5.list&#xff08;列表&#xff09;的遍历5.1 列表的…

RabbitMQ 入门到应用 ( 三 ) 交换机分类

4.交换机 Exchange 分类 4.0.创建队列Queue 在 操作界面 分别 添加 fivemall.goods fivemall.order fivemall.admin yuan.admin 四个队列 4.1.Direct Exchange(直接交换机) 该类型的交换器将所有发送到该交换器的消息被转发到RoutingKey指定的队列中&#xff0c;也就是说路由…

JavaScript JSON

文章目录JavaScript JSON什么是 JSON?JSON 实例JSON 格式化后为 JavaScript 对象JSON 语法规则JSON 数据 - 一个名称对应一个值JSON 对象JSON 数组JSON 数组JSON 字符串转换为 JavaScript 对象相关函数JavaScript JSON JSON 是用于存储和传输数据的格式。 JSON 通常用于服务端…

简单实用的CSS属性(滑轮滚动保持头部不动、暂无数据显示、元素隔开距离、带背景的文字效果、网页上禁止选中文字、校验值有效为绿色无效为红色、)

简单实用的CSS属性&#xff08;滑轮滚动保持头部不动、暂无数据显示、元素隔开距离、带背景的文字效果、网页上禁止选中文字、校验值有效为绿色无效为红色、&#xff09; 目录 一、滑轮滚动保持头部不动 二、暂无数据显示 三、元素隔开距离 四、带背景的文字效果 backgro…

9个相见恨晚的提升办公效率的网站!

推荐9个完全免费的神器网站&#xff0c;每一个都是功能强大&#xff0c;完全免费&#xff0c;良心好用&#xff0c;让你相见恨晚。 1&#xff1a;知犀思维导图 https://www.zhixi.com/ 知犀思维导图是一个完全免费的宝藏在线思维导图工具。它完全免费&#xff0c;界面简洁唯美…

二【单表的增删改查】(只演示增 )

目录1.1 前述1.2 结果映射resultMap1.2.1 字段名和属性名不匹配情况1.2.2 解决方法1.3 使用Insert 方法添加数据&#xff08;涉及主键 问题&#xff09;1.1 前述 MyBatis可以方便的对数据库进行操作&#xff0c;而数据库表可能是一个相对独立的表&#xff08;这里谓之单表&…