Leetcode92. 反转链表 II
Every day a Leetcode
题目来源:92. 反转链表 II
解法1:模拟
注意 STL 的 reverse() 是左闭右开的。
代码:
class Solution
{
public:ListNode *reverseBetween(ListNode *head, int left, int right){vector<int> nums = getNums(head);reverse(nums.begin() + left - 1, nums.begin() + right);return buildList(nums);}// 辅函数 - 遍历链表vector<int> getNums(ListNode *head){ListNode *p = head;vector<int> nums;while (p){nums.push_back(p->val);p = p->next;}return nums;}// 辅函数 - 根据数组建立链表ListNode *buildList(vector<int> &nums){ListNode *dummy = new ListNode(0);ListNode *cur = dummy;for (int &num : nums){ListNode *node = new ListNode(num);cur->next = node;cur = cur->next;}return dummy->next;}
};
结果:

复杂度分析:
时间复杂度:O(N),其中 N 是链表总节点数。最坏情况下,需要遍历整个链表。
空间复杂度:O(N),其中 N 是链表总节点数。用到了辅助数组 nums 存储链表元素。
解法2:穿针引线
反转 left 到 right 部分以后,再拼接起来。
我们还需要记录 left 的前一个节点,和 right 的后一个节点。如图所示:

代码:
class Solution
{
public:ListNode *reverseBetween(ListNode *head, int left, int right){ListNode *dummy = new ListNode(0, head);ListNode *pre = dummy;// 从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点for (int i = 0; i < left - 1; i++)pre = pre->next;// 从 pre 再走 right - left + 1 步,来到 right 节点ListNode *rightNode = pre;for (int i = 0; i < right - left + 1; i++)rightNode = rightNode->next;// 切断出一个子链表(截取链表)ListNode *leftNode = pre->next;ListNode *cur = rightNode->next;// 切断链接pre->next = nullptr;rightNode->next = nullptr;// 反转链表的子区间reverseLinkedList(leftNode);// 接回到原来的链表中pre->next = rightNode;leftNode->next = cur;return dummy->next;}// 辅函数 - 反转链表void reverseLinkedList(ListNode *head){ListNode *pre = nullptr;ListNode *cur = head;while (cur){ListNode *next = cur->next;cur->next = pre;pre = cur;cur = next;}}
};
结果:

复杂度分析:
时间复杂度:O(N),其中 N 是链表总节点数。最坏情况下,需要遍历整个链表。
空间复杂度:O(1),只用到了常数个指针变量。
解法3:一次遍历「穿针引线」反转链表(头插法)
整体思想是:
在需要反转的区间里,每遍历到一个节点,让这个新节点来到反转部分的起始位置。
下面的图展示了整个流程:

下面我们具体解释如何实现。使用三个指针变量 pre、curr、next 来记录反转的过程中需要的变量,它们的意义如下:
- cur:指向待反转区域的第一个节点 left;
- next:永远指向 curr 的下一个节点,循环过程中,curr 变化以后 next 会变化;
- pre:永远指向待反转区域的第一个节点 left 的前一个节点,在循环过程中不变。
我们使用 ①、②、③ 标注「穿针引线」的步骤。

操作步骤:
- 先将 curr 的下一个节点记录为 next;
- 执行操作 ①:把 curr 的下一个节点指向 next 的下一个节点;
- 执行操作 ②:把 next 的下一个节点指向 pre 的下一个节点;
- 执行操作 ③:把 pre 的下一个节点指向 next。
第 1 步完成以后「拉直」的效果如下:

第 2 步,同理。同样需要注意 「穿针引线」操作的先后顺序。

第 2 步完成以后「拉直」的效果如下:

第 3 步,同理。

第 3 步完成以后「拉直」的效果如下:

结果:

复杂度分析:
时间复杂度:O(N),其中 N 是链表总节点数。最坏情况下,需要遍历整个链表。
空间复杂度:O(1),只用到了常数个指针变量。
相关文章:
Leetcode92. 反转链表 II
Every day a Leetcode 题目来源:92. 反转链表 II 解法1:模拟 注意 STL 的 reverse() 是左闭右开的。 代码: class Solution { public:ListNode *reverseBetween(ListNode *head, int left, int right){vector<int> nums getNums(…...
【算法作业记录】
插入排序 递归实现 直接插入 #将a[n]插入有序区间a[0,n-1]中 时间复杂度 O(n) def Insert(a,n):inwhile(i>0 and a[i-1]>a[i]):tmpa[i]a[i]a[i-1]a[i-1]tmpi-1return #直接插入排序 def Insertsort(a,n):for i in range(1,n):#【1,n-…...
回归预测、分类预测、时间序列预测 都有什么区别?
回归预测、分类预测和时间序列预测都是统计和机器学习领域中的预测任务,它们在问题设置和解决的方式上有一些关键区别: 回归预测: 回归预测用于预测连续数值的输出,通常是实数。例如,预测房价、气温、销售额等连续型输…...
关于网络协议的若干问题(三)
1、当发送的报文出问题的时候,会发送一个 ICMP 的差错报文来报告错误,但是如果 ICMP 的差错报文也出问题了呢? 答:不会导致产生 ICMP 差错报文的有: ICMP 差错报文(ICMP 查询报文可能会产生 ICMP 差错报文…...
办公室人人在用的iTab桌面真的好用吗?
本人坐标北京,在一家中型互联网公司当社畜多年。最近发现一个奇怪的现象,我工位前后左右的同事都跟我在用一样的浏览器桌面——iTab新标签页。我表示莫非真的英雄所见略同? 我是去年1月份在刷B站时偶然刷到一条评论,有人分享自己…...
循环中的else语句
while 循环else结构: 循环可以和else配合使用,else下方缩进的代码指的是当循环正常结束之后要执行的代码. 需求:女朋友生气了,要惩罚:连续说5遍“老婆大人,我错了”,如果道歉正常完毕后女朋友就原谅我了:…...
三.镜头知识之FOV
三.镜头知识之视场角 最近试了很多sensor, 每次在选镜头时都对其提到的FOV参数一头雾水。不同的sensor要配不同的镜头,而不同的镜头由于焦距的不同,FOV也不一样。这其中有什么联系呢?FOV又分为HFOV(水平), VFOV( 垂直)…...
分布式事务入门
文章目录 分布式事务问题本地事务分布式事务演示分布式事务问题 理论基础CAP定理一致性可用性分区容错矛盾 BASE理论 SeataSeata的架构部署TC服务微服务集成seata 动手实践XA模式两阶段提交Seata的XA模型实现XA模式 AT模式Seata的AT模型流程梳理脏写问题实现AT模式 TCC模式流程…...
Ubuntu的中文乱码问题
一、Ubuntu的中文乱码问题 sudo apt-get install language-pack-zh-hans 二、修改/etc/environment(在文件的末尾追加): LANG"zh_CN.UTF-8" LANGUAGE"zh_CN:zh:en_US:en" 三、修改/var/lib/locales/supported.d/loca…...
[GXYCTF2019]Ping Ping Ping - RCE(空格、关键字绕过[3种方式])
[GXYCTF2019]Ping Ping Ping 1 解题流程1.1 小试牛刀1.2 三种解法1.2.1 解法一:变量定义拼接绕过1.2.2 解法二:base64编码绕过1.2.3 解法三:内联执行绕过2 思考总结1 解题流程 1.1 小试牛刀 1、提示?ip,结合题目名称,我们直接输入?ip=127.0.0.1 PING 127.0.0.1 (127.…...
ceph 分布式存储与部署
目录 一、存储基础: 1.单机存储设备: 2. 单机存储的问题: 3. 商业存储解决方案: 4. 分布式存储: 5. 分布式存储的类型: 二、Ceph 简介: 三、Ceph 优势: 四、Ceph 架构:…...
Go 结构体深度探索:从基础到应用
1. 结构体概述 在计算机编程中,数据结构是组织、管理和存储数据的一种方式,它允许高效地执行各种操作。Go语言中的结构体(Struct)是这些数据结构中的一员,它为数据的组织提供了一种具体的方式。 结构体可以被视为是多…...
分布式系统开发技术中的CAP定理原理
分布式系统开发技术中的CAP定理原理 在分布式系统开发中,CAP定理(一致性、可用性和分区容忍性)是指导我们设计、开发和维护系统的核心原理。该定理阐述了分布式系统中一致性、可用性和扩展性之间无法同时满足的矛盾关系,为我们提…...
Mysql 报错 You can‘t specify target table ‘表名‘ for update in FROM clause
翻译为:不能先select出同一表中的某些值,再update这个表(在同一语句中) 多半是update在where条件后又Select了一次,所以报错 SQL: UPDATE a SET a.name 1 WHERE a.id in (SELECT a.id FROM a WHERE ISNULL(a.id)) …...
【DevOps】DevOps—基本概念
文章目录 1. DevOps2. CI/CD 1. DevOps 维基百科定义: DevOps是一组过程、方法与系统的统称,用于促进 开发、技术运营 和 质量保障(QA) 部门之间的沟通、协作与整合。我理解DevOps是一种软件管理思维模式。 为什么会有DevOps呢&…...
发行版兴趣小组季度动态:Anolis OS 支持大热 AI 软件栈,引入社区合作安全修复流程
发行版兴趣小组(Special Interest Group) :旨在为龙蜥社区构建、发布和维护一个稳定的操作系统发行版。 秋天的季节,发行版兴趣小组在 AI、安全、国产 OS 领域同样也是硕果累累。一起来看一下第三季度发行版兴趣小组的成果总结有…...
android app开发环境搭建
Android是流行的移动设备原生应用开发平台,其支持Java语言以及Kotlin语言的开发环境,本文主要描述官方提供的Android studio集成开发环境搭建。 https://developer.android.google.cn/ 如上所示,从官方上下载最新版本的Android studio集成开…...
oracle入门笔记一
关系型数据库(Oracle) 一、市面上流行的关系型数据库 大型数据库:oracle(甲骨文)、DB2(IBM)、sysbase(sysbase) 百万以上数据 中型数据库:mysql…...
linux下安装ffmpeg的详细教程、ffmpeg is not installed
1、下载解压 wget http://www.ffmpeg.org/releases/ffmpeg-6.0.tar.gz tar -zxvf ffmpeg-6.0.tar.gz 2、 进入解压后目录,输入如下命令/usr/local/ffmpeg为自己指定的安装目录 cd ffmpeg-6.0 ./configure --prefix/usr/local/ffmpeg make sudo make install 3、配置变量 v…...
ctfshow-ssti
web361 名字就是考点,所以注入点就是name 先测试一下存不存在ssti漏洞 利用os模块,脚本 查看一下子类的集合 ?name{{.__class__.__base__.__subclasses__()}} 看看有没有os模块,查找os 利用这个类,用脚本跑他的位置 import …...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能 查看官网:https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...
分布式计算框架学习笔记
一、🌐 为什么需要分布式计算框架? 资源受限:单台机器 CPU/GPU 内存有限。 任务复杂:模型训练、数据处理、仿真并发等任务耗时严重。 并行优化:通过任务拆分和并行执行提升效率。 可扩展部署:适配从本地…...
