【链表】Leetcode 92. 反转链表 II【中等】

反转链表 II

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

示例 1:
在这里插入图片描述
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

解题思路1

1、遍历链表:

  • 找到 left 前面的节点(preLeft),以及 left 节点本身(leftNode)。
  • 找到 right 节点(rightNode),以及 right 后面的节点(postRight)。
    2、反转部分链表:
  • 将 leftNode 到 rightNode 之间的节点进行反转。
    3、重新连接:
  • 将 preLeft 的 next 指向 rightNode。
  • 将 leftNode 的 next 指向 postRight。

java实现1

public class ReverseBetween {public static class ListNode {int val;ListNode next;ListNode(int x) {val = x;}}public ListNode reverseBetween(ListNode head, int left, int right) {// 创建虚拟头节点,简化边界处理ListNode dummyNode = new ListNode(-1);dummyNode.next = head;ListNode preLeft = dummyNode;// 第 1 步:找到 left 节点的前一个节点 prefor (int i = 0; i < left - 1; i++) {preLeft = preLeft.next;}// 第 2 步:找到 right 节点ListNode rightNode = preLeft;for (int i = 0; i < right - left + 1; i++) {rightNode = rightNode.next;}// 第 3 步:切断出一个子链表(截取链表)ListNode leftNode = preLeft.next;ListNode postRight = rightNode.next;// 切断链接preLeft.next = null;rightNode.next = null;// 第 4 步:反转链表的子区间reverseLinkedList(leftNode);// 第 5 步:接回到原来的链表中preLeft.next = rightNode;leftNode.next = postRight;return dummyNode.next;}private void reverseLinkedList(ListNode head) {ListNode pre = null;ListNode cur = head;while (cur != null) {ListNode next = cur.next;cur.next = pre;pre = cur;cur = next;}}public static void main(String[] args) {ReverseBetween reverseBetween = new ReverseBetween();// 创建示例链表 1->2->3->4->5ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);// 测试反转第2到第4个节点ListNode newHead = reverseBetween.reverseBetween(head, 2, 4);printList(newHead); // 输出: 1->4->3->2->5}// 辅助方法:打印链表public static void printList(ListNode head) {ListNode current = head;while (current != null) {System.out.print(current.val);if (current.next != null) {System.out.print("->");}current = current.next;}System.out.println();}
}

时间空间复杂度1

  • 时间复杂度:O(N),其中 N是链表总节点数。最坏情况下,需要遍历整个链表。

  • 空间复杂度:O(1)。只使用到常数个变量。

解题思路2

解题思路1缺点是:如果 left 和 right 的区域很大,恰好是链表的头节点和尾节点时,找到 left 和 right 需要遍历一次,反转它们之间的链表还需要遍历一次,虽然总的时间复杂度为 O(N),但遍历了链表 2 次。

1、初始化和定位:

  • 使用指针 pre 遍历到 left 前一个节点,定位到反转区间的前一个节点。
    局部反转:

2、使用三个指针 pre、cur 和 next 进行反转操作:

  • pre 指向反转区间的前一个节点。

  • cur 指向当前需要反转的节点。

  • next 指向当前节点的下一个节点,用于在反转过程中进行位置交换。
    3、反转区间:

  • 通过逐个移动 cur 和 next 节点的位置,在反转区间内执行交换操作,完成局部反转。

图解:
在这里插入图片描述

在这里插入图片描述
核心代码分析:

  • curr:指向待反转区域的第一个节点 left;
  • next:永远指向 curr 的下一个节点,循环过程中,curr 变化以后 next 会变化;
  • pre:永远指向待反转区域的第一个节点 left 的前一个节点,在循环过程中不变。
   			// 先将 curr 的下一个节点记录为 next;next = cur.next;//执行操作1:把 curr 的下一个节点指向 next 的下一个节点cur.next = next.next;//执行操作2:把 next 的下一个节点指向 pre 的下一个节点next.next = pre.next;//执行操作3:把 pre 的下一个节点指向 nextpre.next = next;

在这里插入图片描述
在这里插入图片描述
后续同理
在这里插入图片描述
在这里插入图片描述

java实现2

public class ReverseBetween {public static class ListNode {int val;ListNode next;ListNode(int x) {val = x;}}public ListNode reverseBetween(ListNode head, int left, int right) {// 设置 dummyNode 是这一类问题的一般做法ListNode dummyNode = new ListNode(-1);dummyNode.next = head;ListNode pre = dummyNode;//找到pre结点for (int i = 0; i < left - 1; i++) {pre = pre.next;}//当前current节点ListNode cur = pre.next;ListNode next;for (int i = 0; i < right - left; i++) {// cur的下一个节点赋值给nextnext = cur.next;//cur指向next指向的节点cur.next = next.next;//next指向pre指向的节点next.next = pre.next;//pre指向nextpre.next = next;}return dummyNode.next;}public static void main(String[] args) {ReverseBetween reverseBetween = new ReverseBetween();// 创建示例链表 1->2->3->4->5ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);// 测试反转第2到第4个节点ListNode newHead = reverseBetween.reverseBetween(head, 2, 4);printList(newHead); // 输出: 1->4->3->2->5}// 辅助方法:打印链表public static void printList(ListNode head) {ListNode current = head;while (current != null) {System.out.print(current.val);if (current.next != null) {System.out.print("->");}current = current.next;}System.out.println();}
}

时间空间复杂度2

  • 时间复杂度:O(N),其中 N 是链表总节点数。最多只遍历了链表一次,就完成了反转。

  • 空间复杂度:O(1)。只使用到常数个变量。

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

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

相关文章

Solidity 教程01 Remix IDE 初次见面

访问链接地址&#xff1a; https://remix.ethereum.org/ 文件管理器 文件资源管理器用于管理工作区和文件。此插件还包含许多快捷方式和命令。要快速浏览&#xff0c;请右键单击文件以获取弹出菜单&#xff0c;并检查插件右上角的汉堡菜单。 要找到文件资源管理器模块 - 单…

rust语言初识

程序设计实践课上水一篇ing 来源&#xff1a;rust基础入门-1.初识rust-酷程网 (kucoding.com) rust作为一名新兴语言&#xff0c;与go又有些许不同&#xff0c;因为它的目标是对标系统级开发&#xff0c;也就是C、C这两位在编程界的位置。比如我们最常用的windows系统&#x…

001.数据分析_NumPy

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

【ai】pycharm设置软件仓库编译运行基于langchain的chatpdf

联想笔记本 y9000p创建python工程: 使用langchain支持openai的向量化embedding安装软件包 发现没有openai ,添加软件仓库打开工具窗口 点击设置

Jlink卡死 JFlash keil 盗版JLINK

现象&#xff1a;用Keil打开Jlink配置页&#xff0c;会卡死。 解决方法&#xff1a;用旧版本的Jlink软件&#xff0c;因为淘宝买的很多JLINK下载器是盗版的&#xff0c;不支持新版本的JLINK软件。到https://www.segger.com/downloads/jlink下载旧版本的软件。 如果必须要用新版…

SQLI-labs-第二十五关和第二十五a关

目录 第二十五关 1、判断注入点 2、判断数据库 3、判断表名 4、判断字段名 5、获取数据库的数据 第二十五a关 1、判断注入点 2、判断数据库 第二十五关 知识点&#xff1a;绕过and、or过滤 思路&#xff1a; 通过分析源码和页面&#xff0c;我们可以知道对and和or 进…

链表经典题目—相交链表和链表倒数第k个节点

&#x1f389;&#x1f389;&#x1f389;欢迎莅临我的博客空间&#xff0c;我是池央&#xff0c;一个对C和数据结构怀有无限热忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;这里是我分享C/C编程、数据结构应用的乐园✨ &#x1f388;&#x1f388;&…

艾体宝干货 | 教程:使用ntopng和nProbe监控网络流量

本教程旨在分享如何通过 ntopng 和 nProbe 这两款工具&#xff0c;深入了解和掌握网络流量监控的艺术。我们将提供从基本概念到高级应用的全面指导&#xff0c;涵盖了在多种平台和设备上的部署和配置步骤。不论您是专业人员还是技术爱好者&#xff0c;跟随本教程&#xff0c;都…

11thingsboard物联网网关接入ThingsBoard物联网平台的操作说明

本文包含关于如何配置ThingsBoard 平台和连接钡铼技术R40设备的说明。ThingsBoard平台是一个用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准MQTT协议实现设备连接。ThingsBoard结合了可扩展性、容错性和性能&#xff0c;因此您永远不会丢失数据。 4G L…

【考研数学】线代除了「李永乐」,还能跟谁?

考研线代&#xff0c;除了利用了老师&#xff0c;我觉得还有一个宝藏老师的课程值得听&#xff01; 那就是喻老&#xff0c;这个是我在b站上面新发现的老师&#xff0c;听完他的课程发现真的喜欢 他不仅在B站上开设了课程&#xff0c;还编写了配套的线性代数辅导讲义&#xff…

Python中的SSH、SFTP和FTP操作详解

大家好&#xff0c;在网络编程中&#xff0c;安全地连接到远程服务器并执行操作是一项常见任务。Python 提供了多种库来实现这一目标&#xff0c;其中 Paramiko 是一个功能强大的工具&#xff0c;可以轻松地在 Python 中执行 SSH、SFTP 和 FTP 操作。本文将介绍如何使用 Parami…

企业选择定制化MES管理系统时需要考虑的核心功能

在当今制造业的数字化转型浪潮中&#xff0c;企业对于实现生产现场透明管理的需求愈发迫切。为了满足这一需求&#xff0c;MES管理系统成为了众多企业的首选解决方案。MES管理系统以其高度的灵活性和可定制性&#xff0c;能够根据不同行业的特性&#xff0c;为企业提供量身定制…

看潮成长日程表用户手册(上)

看潮成长日程表用户手册&#xff08;上&#xff09; 一、特色功能1、以每周日程表为主要形式2、全时管控的时间管理3、持续的日程管理4、分期间时间表5、按日排程&#xff0c;按周输出6、夏季作息时间处理7、年度假日处理8、休息日处理9、弹性日程10、完成记录11、多种输出形式…

重构与优化-前言

关注公众号畅读:IT技术馆 Java代码重构是优化现有代码结构、提升代码可读性、可维护性和性能的过程,而不会改变其外在行为。这包括命名规范、消除重复代码、改进设计模式的使用、优化数据结构和算法等。下面是一些常见的Java代码重构技巧及示例: 1. 重命名(Rename) 目的…

光纤跳线组成结构划分你知道吗

按照组成结构划分 光纤跳线根据组成结构的不同可分为带状光纤跳线和束状光纤跳线。带状光纤跳线使用的是由光纤带组成的带状光缆&#xff0c;大多呈扁平形状&#xff0c;因具有较高的光纤密度&#xff0c;它可以容纳更多的纤芯&#xff0c;因此大大节省布线成本和空间&#xf…

猫咪掉毛严重怎么办?小米、希喂、霍尼韦尔宠物空气净化器测评

吸猫成瘾&#xff0c;养猫“致贫”&#xff1f;在当今社会&#xff0c;养猫已成为众多年轻人的一个追捧的事情。乖巧又可爱&#xff0c;下班回到家撸一把猫已经成为年轻人的日常。但是猫咪可爱也不影响它的各种养猫伴生的问题&#xff01;无论是漂浮的浮毛、飘散的皮屑还是偶发…

2024年上半年系统架构设计师真题-复原程度90%

前言 此次考试监考特别严格&#xff0c;草稿纸不允许带出考场&#xff0c;并且准考证上不允许任何写画&#xff0c;甚至连笔都允许带一支&#xff0c;所以下面的相关题目都是参考一些群友的提供&#xff0c;加上自己的记忆回顾&#xff0c;得到的结果。 其中综合知识部分的题…

1.int 与 Integer 的简单区别

蓝桥杯刷题从此开始&#xff1a; 第一题就是两个数的和&#xff0c;个人看来主要考察 int与integer 的区别&#xff1b; 这是我提交的答案&#xff0c;竟然会报错&#xff1a; import java.util.*; //输入A、B&#xff0c;输出AB。 class add {public static void main(String …

yolov10 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快

特别说明&#xff1a;参考官方开源的yolov10代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 yolov8、v9还没玩热乎&#xff0c;这不yolov10又来了&#xff0c;那么…

tomcat--安全配置多虚拟机

端口8005/tcp 安全配置管理 8005是Tomcat的管理端口&#xff0c;默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个字符串&#xff0c;tomcat接收到后就会关闭此Server。此管理功能建议禁用&#xff0c;可将SHUTDOWN改为一串猜不出的字符串实现或者port修改成…