【LeetCode 92.】 反转链表 II

1.题目

虽然本题很好拆解,但是实现起来还是有一些难度的。

2. 分析

  • 尽可能抽象问题,然后简化代码

我在写本题的时候,遇到了下面这两个问题:

  • 没有把[left,right] 这个区间的链表给断开,所以导致反转起来非常麻烦。所以在找到[left, right] 区间后,要将这个链表前后断开会比较方便操作。
  • 正是因为问题1,导致我在反转链表的时候,使用了下面这版代码:
# Definition for singly-linked list.
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass Solution:def reverseBetween(self, head: ListNode, left: int, right: int) :# 如果区间为1,不用反转if left == right:return headcnt = 1head_bak = headwhile(cnt < left):head_bak = head_bak.nextcnt+=1new_left = head_bakhead_bak = headcnt = 1while(cnt < right):head_bak = head_bak.nextcnt+=1new_right = head_bakprint(new_left.val, new_right.val)reversed_head = new_rightreversed_tail = new_leftsplit_head = headsplit_tail = new_right.nextwhile(split_head.next != new_left):split_head = split_head.next# 开始反转pre = Noneprint("hhh",new_right.next.val)cnt = 0 # 反转节点的个数# while(cnt < right-left+2):        while(new_left != new_right.next):print(id(new_right.next))tmp = new_left.nextnew_left.next = prepre = new_leftnew_left = tmpcnt+=1# print(new_left.val , new_left == new_right.next, id(new_left), id(new_right.next))split_head.next = reversed_headreversed_tail.next = split_tailif reversed_tail == head:return reversed_headreturn headhead1 = ListNode(1)
head2 = ListNode(2)
head3 = ListNode(3)
head4 = ListNode(4)
head5 = ListNode(5)
head1.next = head2
head2.next = head3
head3.next = head4
head4.next = head5
head5.next = None
start = head1
while(start):print(id(start))start = start.next
s = Solution()
s.reverseBetween(head1, 2, 4)

这份代码有一个隐蔽的bug:
在这里插入图片描述
在 41 ~ 47 行之间。原因是 while 循环的过程中会把 new_right.next 的值给改掉(也就是44行的代码),因为new_right 指的是right那个地方的节点,这个节点new_left 在遍历的过程中也会访问。
这份代码最大的问题就是没有意识到这个new_right.next 值在while时候变化了。

3.代码

下面这份代码虽然可以过掉样例,但是代码很丑。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverseBetween(self, head: ListNode, left: int, right: int) :# 如果区间为1,不用反转if left == right:return headcnt = 1head_bak = headwhile(cnt < left):head_bak = head_bak.nextcnt+=1new_left = head_bakhead_bak = headcnt = 1while(cnt < right):head_bak = head_bak.nextcnt+=1new_right = head_bakprint(new_left.val, new_right.val)reversed_head = new_rightreversed_tail = new_leftsplit_head = Nonesplit_tail = new_right.nextcnt = 1hh_head = headwhile(cnt < left):split_head = hh_headhh_head = hh_head.next            cnt += 1# 开始反转pre = None# print("hhh",new_right.next.val)cnt = 0 # 反转节点的个数while(cnt < right-left+1):# print(id(new_right.next))tmp = new_left.nextnew_left.next = prepre = new_leftnew_left = tmpcnt+=1# print(new_left.val , new_left == new_right.next, id(new_left), id(new_right.next))if split_head:split_head.next = reversed_headreversed_tail.next = split_tailif reversed_tail == head:return reversed_headreturn head

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

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

相关文章

【iOS】KVO相关总结

目录 1. 什么是KVO&#xff1f;2. KVO的基本使用3. KVO的进阶使用observationInfo属性context 的使用KVO触发监听方法的方式自动触发手动触发 KVO新旧值相等时不触发KVO的从属关系一对一关系一对多关系 4. KVO使用注意5. KVO本质原理分析伪代码保留伪代码下的类并编译运行对比添…

小白都能看懂的 “栈”

什么是栈&#xff1f;首先引用维基百科的解释&#xff1a; 栈&#xff08;stack&#xff09;是计算机科学中的一种抽象资料类型&#xff0c;只允许在有序的线性资料集合的一端&#xff08;称为堆栈顶端&#xff0c;top&#xff09;进行加入数据&#xff08;push&#xff09;和移…

Go语言结构体内嵌接口

前言 在golang中&#xff0c;结构体内嵌结构体&#xff0c;接口内嵌接口都很常见&#xff0c;但是结构体内嵌接口很少见。它是做什么用的呢&#xff1f; 当我们需要重写实现了某个接口的结构体的(该接口)的部分方法&#xff0c;可以使用结构体内嵌接口。 作用 继承赋值给接口…

信号与系统实验MATLAB-实验1-信号的MATLAB表示及信号运算

实验1-信号的MATLAB表示及信号运算 一、实验目的 1、掌握MATLAB的使用&#xff1b; 2、掌握MATLAB生成信号波形&#xff1b; 3、掌握MATLAB分析常用连续信号&#xff1b; 4、掌握信号运算的MATLAB实现。 二、实验内容 编写程序实现下列常用函数&#xff0c;并显示波形。…

PyTorch -- Visdom 快速实践

安装&#xff1a;pip install visdom 注&#xff1a;如果安装后启动报错可能是 visdom 版本选择问题 启动&#xff1a;python -m visdom.server 之后打开出现的链接 http://localhost:8097Checking for scripts. Its Alive! INFO:root:Application Started INFO:root:Working…

数据网格和视图入门

WinForms数据网格&#xff08;GridControl类&#xff09;是一个数据感知控件&#xff0c;可以以各种格式&#xff08;视图&#xff09;显示数据。本主题包含以下部分&#xff0c;这些部分将指导您如何使用网格控件及其视图和列&#xff08;字段&#xff09;。 Grid Control’s…

BUUCTF-Web题目1

目录 [HCTF 2018]admin 1、题目 2、知识点 3、思路 [极客大挑战 2019]BuyFlag 1、题目 2、知识点 3、思路 [HCTF 2018]admin 1、题目 2、知识点 BP暴力破解密码 3、思路 打开题目&#xff0c;查看页面源代码&#xff0c;发现需要admin用户才可以登录 这一台有很多解法…

LeetCode | 20.有效的括号

这道题就是栈这种数据结构的应用&#xff0c;当我们遇到左括号的时候&#xff0c;比如{,(,[&#xff0c;就压栈&#xff0c;当遇到右括号的时候&#xff0c;比如},),]&#xff0c;就把栈顶元素弹出&#xff0c;如果不匹配&#xff0c;则返回False&#xff0c;当遍历完所有元素后…

K8s 卷快照类

卷快照类 卷快照类 这个警告信息通常出现在使用 kubectl 删除 Kubernetes 集群资源时&#xff0c;如果尝试删除的是集群作用域&#xff08;cluster-scoped&#xff09;的资源&#xff0c;但指定了命名空间&#xff08;namespace&#xff09;&#xff0c;就会出现这个警告。 集…

基于PointNet / PointNet++深度学习模型的激光点云语义分割

一、场景要素语义分割部分的文献阅读笔记 1.1 PointNet PointNet网络模型开创性地实现了直接将点云数据作为输入的高效深度学习方法&#xff08;端到端学习&#xff09;。最大池化层、全局信息聚合结构以及联合对齐结构是该网络模型的三大关键模块&#xff0c;最大池化层解决了…

72、AndroidStudio 导入项目Connect timed out错误解决

一、背景&#xff1a; 开发过程中难免会 clone 其他的项目&#xff0c;clone 或者下载成功之后。使用 android studio 打开项目时经常遇到 Connect timed out错误如图所示&#xff1a; 二、分析原因&#xff1a; 1、既然链接超时&#xff0c;肯定是 android studio 在运行…

包装类的应用

一.什么是包装类 基本数据类型所对应的引用数据类型 二.集合中不能存储基本数据类型 三.JDK5以后对包装类新增了什么特性&#xff1f; // 自动装箱:把基本数据类型会自动的变成对应的包装类 // 自动拆箱:把包装类自动的变成其对象的基本数据类型 四.我们以后如何获取包…

02-MybatisPlus批量插入性能够吗?

1 前言 “不要用 mybatis-plus 的批量插入&#xff0c;它其实也是遍历插入&#xff0c;性能很差的”。真的吗&#xff1f;他们的立场如下&#xff1a; 遍历插入&#xff0c;反复创建。这是一个重量级操作&#xff0c;所以性能差。这里不用看源码也知道&#xff0c;因为这个和…

数据结构:手撕代码——顺序表

目录 1.线性表 2.顺序表 2.1顺序表的概念 2.2动态顺序表实现 2.2-1 动态顺序表实现思路 2.2-2 动态顺序表的初始化 2.2-3动态顺序表的插入 检查空间 尾插 头插 中间插入 2.2-4 动态顺序表的删除 尾删 头删 中间删除 2.2. 5 动态顺序表查找与打印、销毁 查找 …

mysql导入sql文件失败及解决措施

1.报错找不到表 1.1 原因 表格创建失败&#xff0c;编码问题mysql8相较于mysql5出现了新的编码集 1.2解决办法&#xff1a; 使用vscode打开sql文件ctrlh&#xff0c;批量替换&#xff0c;替换到你所安装mysql支持的编码集。 2.timestmp没有设置默认值 Error occured at:20…

一个公用的数据状态修改组件

灵感来自于一项重复的工作&#xff0c;下图中&#xff0c;这类禁用启用、审核通过不通过、设计成是什么状态否什么状态的场景很多。每一个都需要单独提供接口。重复工作还蛮大的。于是&#xff0c;基于该组件类捕获组件跳转写了这款通用接口。省时省力。 代码如下&#xff1a;…

Linux开机自启/etc/init.d和/etc/rc.d/rc.local

文章目录 /etc/init.d和/etc/rc.d/rc.local的区别/etc/init.dsystemd介绍 /etc/init.d和/etc/rc.d/rc.local的区别 目的不同&#xff1a; /etc/rc.d/rc.local&#xff1a;用于在系统启动后执行用户自定义命令&#xff0c;适合简单的启动任务。 /etc/init.d&#xff1a;用于管理…

实现一个vue js小算法 选择不同的时间段 不交叉

以上图片选择了时间段 现在需要判断 当前选择的时间段 不能够是 有交叉的所以现在需要循环判断 //判断时间段是否重叠交叉 export function areIntervalsNonOverlapping(intervals:any) {// 辅助函数&#xff1a;将时间字符串转换为从当天午夜开始计算的分钟数function conver…

信息系统架构风格-系统架构师(十

1、信息系统架构风格是描述特定应用领域中系统组织方式的惯用模式。架构风格定义了一个系统家族&#xff0c;即一个架构定义&#xff08;&#xff09;。 A一组设计原则 B一组模式 C一个词汇表和一组约束 D一组最佳实践 解析&#xff1a; 信息系统架构风格是描述某一特定 应…

汽车金属管检测新方法,分度盘高速视觉检测机检测效果如何?

汽车金属管是指在汽车制造和维修中广泛使用的金属管道&#xff0c;用于传输流体、气体或其他介质。汽车金属管在汽车中扮演着重要的角色&#xff0c;用于传输液体&#xff08;如燃油、冷却液、润滑油&#xff09;、气体&#xff08;如空气、排气&#xff09;、制动系统、液压系…