Leetcode92. 反转链表 II

news2024/11/15 15:43:41

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 的前一个节点,在循环过程中不变。

我们使用 ①、②、③ 标注「穿针引线」的步骤。

在这里插入图片描述

操作步骤:

  1. 先将 curr 的下一个节点记录为 next;
  2. 执行操作 ①:把 curr 的下一个节点指向 next 的下一个节点;
  3. 执行操作 ②:把 next 的下一个节点指向 pre 的下一个节点;
  4. 执行操作 ③:把 pre 的下一个节点指向 next。

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

第 3 步,同理。

在这里插入图片描述

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

在这里插入图片描述

结果:

在这里插入图片描述

复杂度分析:

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

空间复杂度:O(1),只用到了常数个指针变量。

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

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

相关文章

Altium Designer 20.2.3导入自带的原理图库

看了几天的AD学习视频&#xff0c;把我看得晕头转向的&#xff0c;静整些没用的东西&#xff0c;浪费时间&#xff0c;画个原理图讲了好几天&#xff0c;就那么点东西&#xff0c;在那扯淡&#xff0c;有系统自带的库他不教你怎么用&#xff0c;故意藏着掖着。想叫学习的小伙伴…

抽象轻松的java——mybaties

前置工作http://t.csdnimg.cn/RVvn4完成了前置工作后的IDEA应该是这样的 正式进入mybaties的入门 第一步&#xff0c;打开mybaties的官网文档https://mybatis.net.cn/getting-started.html本次入门&#xff0c;将从XML构造SQL工厂 第一步&#xff0c;创建一个XML文件&#xf…

Java架构师主流架构设计模式

目录 1 主流架构设计模式1.1 分层架构模式1.1.1 分层架构的一些常见原则1.1.2 分层的单向依赖原则1.1.3 无循环依赖的原则1.1.4 避免跨层通信的原则1.2 微服务架构模式1.3 基于事件的架构模式2 整洁架构3 六边形架构4 微内核架构模式5 基于空间的架构模式6 道过滤器模式和代理模…

UE5中实现沿样条线创建网格体2-SplineMesh版本

我在之前的一篇文章中写过沿样条线创建网格体的方法&#xff1a; https://blog.csdn.net/grayrail/article/details/130453733 但该方法没有网格变形操作&#xff0c;就会导致每一段网格对象是无法连接的&#xff1a; 后来发现了SplineMesh方法可以比较好的解决这个问题&…

电子沙盘数字沙盘大数据人工智能开发教程第16课

电子沙盘数字沙盘大数据可视化GIS系统开发教程第16课&#xff1a;新增加属性在MTGIS3d控件 public bool ShowFLGrid;//是否显 示方里网格。 public bool Atmosphere;//是否显示大气圈。&#xff08;因为WPF不支持shader功能&#xff0c;所以效果嘛。。。&#xff09; 在SDK中为…

ACK 云原生 AI 套件:云原生 AI 工程化落地最优路径

作者&#xff1a;胡玉瑜(稚柳) 前言 在过去几年中&#xff0c;人工智能技术取得了突飞猛进的发展&#xff0c;涵盖了机器学习、深度学习和神经网络等关键技术的重大突破&#xff0c;这使得人工智能在各个领域都得到广泛应用&#xff0c;对各行各业产生了深远的影响。 特别值…

Springcloud中间件-----分布式搜索引擎 Elasticsearch

该笔记是根据黑马程序员的课来自己写了一遍的,b站有对应教程和资料 第一部分 第二部分 第三部分 预计看完跟着练习5小时足够 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff…

【调试工具|mqtt-spy】mqtt客户端调试工具 mqtt-spy 详细使用教程

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

数据分析:小红书“情绪营销”如何拿捏年轻人

导语 小红书话题#不扫兴养成计划#上线&#xff0c;近30天话题浏览量破5000W&#xff0c;同比增长418.19%&#xff0c;数据表现良好。 图 | 千瓜数据 什么是不扫兴养成&#xff1f; 定义&#xff1a;想了解“不扫兴”的意思&#xff0c;那就先来看看它的反义“扫兴”吧。“扫…

2023版 STM32实战9 RTC实时时钟/闹钟

RTC简介 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 注意事项 -1- 要手动配置中断寄存器 -2- 需要等待写操作完成 -3- 时钟闹钟中段…

JVM 性能监控与故障处理工具

基础工具 jps&#xff1a;虚拟机进程状态工具 jps 命令格式&#xff1a;jps [options] [hostid] 命令可选项解释&#xff1a; 选项解释-q只输出 LVMID&#xff0c;省略主类的名称-m输出传给 main 函数的参数-l输出主类的全名&#xff0c;如果进程运行的 JAR 包&#xff0c;…

ESP8266 WiFi物联网智能插座—下位机软件实现

目录 1、软件架构 2、开发环境 3、软件功能 4、程序设计 4.1、初始化 4.2、主循环状态机 4.3、初始化模式 4.4、配置模式 4.5、运行模式 4.6、重启模式 4.7、升级模式 5、程序功能特点 5.1、日志管理 5.2、数据缓存队列 本篇博文开始讲解下位机插座节点的MCU软件…

淘宝京东拼多多商品价格采集分析接口

淘宝、京东、拼多多商品价格采集分析接口的具体信息&#xff0c;但是可以为您提供一些参考内容&#xff1a; 登录京东、天猫、淘宝、拼多多、苏宁、国美、唯品会等电商平台&#xff0c;注册并获取开发者账号和API接口权限。通过开发者账号和API接口权限&#xff0c;访问京东、…

Java之实现添加文字水印、图片水印功能

文章目录 1 添加文字水印、图片水印1.1 给图片添加文字水印1.1.1 获取原图片对象信息1.1.1.1 读取本地图片1.1.1.2 读取网络图片 1.1.2 添加水印1.1.3 确定水印位置1.1.3.1 设置固定值1.1.3.2 根据原图大小进行设置 1.1.4 获取目标图片1.1.5 完整代码 1.2 java实现给图片添加图…

HomeView/主页 的实现

1. 创建数据模型 1.1 创建货币模型 CoinModel.swift import Foundation// GoinGecko API info /*URL:https://api.coingecko.com/api/v3/coins/markets?vs_currencyusd&ordermarket_cap_desc&per_page250&page1&sparklinetrue&price_change_percentage24…

论文中的小细节——为什么论文中总是写WX而不是XW?

这是最近一个师弟问我的问题&#xff0c;为什么在论文里面总是写的 Y W X YWX YWX&#xff0c;而不是 Y X W YXW YXW&#xff1f;就算有的时候需要转置 W W W 或者 X X X&#xff0c;都不写 Y X W YXW YXW&#xff1f; 这个问题我最开始回答的是这就是约定俗成的写法&…

新能源三电系统测试如何快速连接,避免多次插拔?安规测试电连接器的作用

新能源汽车行业高速发展&#xff0c;电机、电动、电池作为核心三部件&#xff0c;必须有严格的检测已确保产品性能、质量、安全性符合要求。其中会涉及多种测试&#xff0c;如&#xff1a;防水防尘/气密测试、EOL测试、DCR测试等&#xff0c;需要连接相应的检测设备仪器。如何快…

LLaVA:大型语言和视觉助手,图片识别和理解能力让人惊叹

01简介 视觉指令调整&#xff1a;针对多模式 GPT-4 级别功能而构建的大型语言和视觉助手。 视觉聊天&#xff1a;构建多模式 GPT-4 级聊天机器人构建了包含 30 个未见过的图像的评估数据集&#xff1a;每个图像都与三种类型的指令相关联&#xff1a;对话、详细描述和…

查找浏览器中保存的密码

edge浏览器 谷歌浏览器 设置-》自动填充密码-》点击密码管理工具 后就可以查看到浏览器保存的密码了

PyTorch 入门

一、说明 深度学习是机器学习的一个分支&#xff0c;其中编写的算法模仿人脑的功能。深度学习中最常用的库是 Tensorflow 和 PyTorch。由于有各种可用的深度学习框架&#xff0c;人们可能想知道何时使用 PyTorch。以下是人们更喜欢使用 Pytorch 来完成特定任务的原因。 Pytorch…