leetcode92 反转链表II

2023-10-31

题目

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

解析

这道题不太简单,分为两种方法,先说不好理解的那种方法,主要是官方题解中的第二种方法(一次遍历穿针引线头插法),注意这种反转和之前遇到过的都不一样,写的时候很容易出错(在画图的前提下,易错点都在下面代码里了)

代码如下:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseBetween(head *ListNode, left int, right int) *ListNode {
	dummy := &ListNode{}
	dummy.Next = head
	pre := dummy
	for i := 0; i < left-1; i++ { // 注意这个left和right的值,自己画图的时候就能发现需要-1才合适
		pre = pre.Next // 此时移到了left所在的前一位
	}
	cur := pre.Next
	for i := 0; i < right-left; i++ { // 这个范围想不明白的话也是画图用测试用例来看
		next := cur.Next
		cur.Next = next.Next
		next.Next = pre.Next // 一定要注意这一步,不是指向cur,因为cur后面会走
		pre.Next = next
	}
	return dummy.Next
}

第二种方法是在之前反转链表的基础上改进,稍微好理解一点,直接调用之前的反转链表的方法(当然这个方法也可以改成不需要返回值)

func reverseBase(head *ListNode) *ListNode {
	var pre *ListNode
	cur := head
	for cur != nil {
		next := cur.Next
		cur.Next = pre
		pre = cur
		cur = next
	}
	return pre
}

func reverseBetween(head *ListNode, left int, right int) *ListNode {
	if head == nil {
		return head
	}
	dummy := &ListNode{}
	dummy.Next = head
	pre := dummy
	for i := 0; i < left-1; i++ {
		pre = pre.Next // pre是left节点前面的一个节点
	}

	// 找到right节点
	rightNode := pre.Next
	for i := 0; i < right-left; i++ { // 画图画图,想不明白就画图
		rightNode = rightNode.Next
	}

	// 在此基础上切割出来一个子链表(先保留最后要链接的节点)
	leftNode := pre.Next
	rightAfter := rightNode.Next

	// 切断链表
	pre.Next = nil
	rightNode.Next = nil

	rightNode = reverseBase(leftNode) // 传入的其实是左结点,反转后返回的是右节点了

	// 接回去
	pre.Next = rightNode
	leftNode.Next = rightAfter

	return dummy.Next
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode92 反转链表II 的相关文章

  • Floyd算法的原理和实现代码

    原理 假设有向图G V E 采用邻接矩阵存储 设置一个二维数组A用于存放当前顶点之间的最短路径长度 分量A i j 表示当前顶点i gt j的最短路径长度 然后 每次添加一个顶点 同时对A的数组进行筛选优化 期间会产生k个A数组 Ak i
  • 第一个vue程序

    div message h2 school name school moblie h2 div

随机推荐

  • 程序、进程、线程联系以及进程和线程的区别和联系

    程序和进程的区别与联系 程序是一组有序的指令集合是一个静态的概念 一个程序由一组指令组成 以二进制方式存在存储器中 进程是程序及其数据在计算机上的一次运行活动 是一个动态的概念 进程的运行实体是程序 离开的程序的进程没有意义 进程是由程序
  • 交互原型设计工具

    1 axure RP 适合 快速创建应用软件或Web线框图 流程图 原型和规格说明文档 优点 支持交互设计 并可生成规格说明文档和输出HTML原型 Axure RP 集 UX 原型 规范和图表于一身 2 Sketch 适合 为视觉设计师打造
  • 图数据库——大数据时代的高铁

    作者 董小珊 姚臻 责编 仲培艺 zhongpy csdn net 本文为 程序员 原创文章 未经允许不得转载 更多精彩文章请订阅 程序员 如果把传统关系型数据库比做火车的话 那么到现在大数据时代 图数据库可比做高铁 它已成为NoSQL中关
  • IDEA鼠标右击new没有class和interface的解决办法

    IDEA点击new没有class和interface 问题如下图 解决办法 1 File gt Project Structure 如下图所示 2 选择Modules gt 右边Sources中选择所需目录 然后点击 Sources gt
  • 云平台的技术

    约束记录表 简朴 勤劳 谦虚 诚恳 禁止浪费 珍惜时间 虚心学习 纯心做人 1 0 1 1 节制 静默 条理 决断 不恋吃睡 开口有益 规整事务 坚持 迅捷 0 1 1 1 正直 中庸 整洁 宁静 贞洁 敬业负责 不倚势凌人 外表整洁 不纠
  • 【解决】windows安装pycrypto出错问题。error C2061: 语法错误: 标识符“intmax_t”

    1 执行命令报错 pip install pycrypto Installing collected packages pycrypto Running setup py install for pycrypto error ERROR C
  • easyUI Tree树动态刷新子节点

    tree tree url xxx 默认是post请求 checkbox false animate true lines true loadFilter function rows 返回要显示的过滤数据 返回数据时以标准树格式返回的 也就
  • MongodbTemplate 批量更新或者修改

    批量更新或者修改 public void saveOnlineStatusList List
  • 线性反馈移位寄存器 LFSR

    参考连接 添加链接描述 运算基础 模2运算 线性反馈移位寄存器用于产生可重复的伪随机序列PRBS 该电路由n级除法器和异或门组成 在k阶段 寄存器存在初值 Rn 1 R1 R0 称为seed 在k 1阶段 寄存器的值变为 k 1阶段 Rn
  • word2010或以上版本编号变成黑块的正确处理方

    打开编号显示为黑块的文档 把光标放置在黑块的后面 然后在键盘上按左方向键 则黑块变灰色 为选中状态 2 然后按下ctrl shift s 出现应用样式窗口点击 重新应用 黑块显示成正常的编号 3 然后点击 多级列表 按钮 选择 定义新的多级
  • 一次数据库的选型,FireBird胜出

    做了n多年的J2EE应用以后 如何做客户端的BI确实让我一下子摸不到门路 近期的一个客户要求我们给他做基于客户端的BI分析 客户是对外提供重要数据的单位 有很多的客户每年购买他的数据 可以说人家的数据库 每行每列都是钱 在这种情况下 他们非
  • css实现文字环绕图片布局

    前言 css实现文字环绕图片的效果 实现效果 实现代码 通过图片属性 align div style width 400px img src d303 paixin com thumbs 3548553 231637502 staff 10
  • 数据结构——AVL树

    目录 1 什么是AVL树 2 AVL树插入的模拟实现 节点定义 插入 旋转 右单旋 左单旋 双旋 右左旋 双旋 左右旋 完整的插入代码 3 AVL树的性能分析 1 什么是AVL树 AVL树是一种自平衡二叉查找树 也被称为高度平衡树 它具有以
  • 小福利,数据可视化之常见图形的绘制

    大家好 我是天空之城 今天带来小福利 数据可视化之常见图形的绘制 读取 本 专 科 群体的数据 college student data pd read csv 工作 college student data csv encoding ut
  • opencv提取图像中的颜色直方图(RGB、HSV)

    本篇博客主要介绍利用opencv工具提取一幅图像中的颜色直方图特征 所谓颜色直方图 指的是一幅图像中的颜色分布 与图像中的特定的物体无关 只是用来表示人的眼睛观察到的图像中的颜色分布情况 例如说 一幅图中红色占了多少比例 绿色占了多少比例等
  • 模型旋转 触摸屏 手指滑动360度旋转 安卓版本 EasyTouch

    using UnityEngine using System Collections using System Collections Generic using DG Tweening using UnityEngine EventSys
  • 4.2.3 积分法(二)——分部积分法

    emmmm想想词 算了想不出来 既然不定积分和导数是反操作 那就从导数开始说吧 先看一个导数公式 就不解释变形过程了 上图其实就是分部积分法的计算过程 总之是分成两个步骤 先分部再积分 至于 C等到完全积分积出来之后再加 目前我们总结过的不
  • 深入 Python 3

    深入 Python 3 http dipyzh bitbucket org table of contents html xml 目录 深入 Python 3 中有何新内容 又名 负号层 安装 Python 深入 哪个版本的 Python
  • ajax前后端交互示例

    文章目录 一 前后端交互方法 1 Ajax前端示例 1 1 特点 1 2 ajax同域请求示例 1 3 ajax跨域请求示例 2 后端示例 2 1 controller层处理 一 前后端交互方法 1 Ajax前端示例 1 1 特点 Ajax
  • leetcode92 反转链表II

    题目 给你单链表的头指针 head 和两个整数 left 和 right 其中 left lt right 请你反转从位置 left 到位置 right 的链表节点 返回 反转后的链表 示例 输入 head 1 2 3 4 5 left 2