LeetCode题练习与总结:反转链表Ⅱ--92

一、题目描述

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

示例 1:

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

示例 2:

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

提示:

  • 链表中节点数目为 n
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n

二、解题思路

  1. 初始化: 创建一个哑结点 dummy,其 next 指针指向 head。这样,即使 head 发生变化,我们也可以通过 dummy.next 获取到新的头结点。同时,我们还需要设置两个指针 pre 和 cur,分别初始化为 dummy

  2. 定位: 将 pre 移动到 left - 1 的位置,将 cur 移动到 left 的位置。

  3. 反转链表: 从 left 到 right,我们需要反转这部分链表。我们可以使用头插法进行链表的反转。具体来说,对于 cur 当前指向的节点,我们将其从链表中取出,然后将其插入到 pre 和 pre.next 之间。

  4. 返回结果: 反转完成后,返回 dummy.next 即为新的头结点。

三、具体代码

class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode pre = dummy;// 定位到left的前一个节点for (int i = 0; i < left - 1; i++) {pre = pre.next;}// cur是left位置的节点ListNode cur = pre.next;// 反转left到right的链表for (int i = 0; i < right - left; i++) {ListNode temp = cur.next; // 取出下一个节点cur.next = temp.next; // 断开连接temp.next = pre.next; // 插入到pre和pre.next之间pre.next = temp;}return dummy.next;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 定位到 left 的前一个节点的循环会运行 left - 1 次。
  • 反转链表的循环会运行 right - left 次。
  • 因此,总的时间复杂度是 O(n),其中 n 是链表的长度。在最坏的情况下,left 和 right 可能分别接近 1 和 n,这将使得时间复杂度接近 O(n)
2. 空间复杂度
  • 该算法只使用了几个额外的节点(dummyprecurtemp),不管链表有多长,这些额外的节点数量都是固定的。
  • 因此,空间复杂度是 O(1),即常数空间复杂度。

综上所述,该算法的时间复杂度是 O(n),空间复杂度是 O(1)

五、总结知识点

1. 链表操作

  • 链表节点的定义:使用 ListNode 类来定义链表节点,每个节点包含一个 val 属性和一个 next 指针。
  • 链表的遍历:通过节点的 next 指针遍历链表。
  • 链表的插入:在链表中插入一个新节点,需要修改相邻节点的 next 指针。

2. 哑结点的使用

  • 哑结点(dummy)是一个辅助节点,通常用于简化边界条件的处理。在这个问题中,它被用来确保即使在链表的头部进行操作,也能保持代码的一致性。

3. 指针的概念

  • pre 和 cur 是两个指针,用于跟踪链表中的当前位置。pre 指向当前节点的前一个节点,而 cur 指向当前节点。

4. 链表的反转

  • 通过改变节点的 next 指针方向,可以实现在原地反转链表的部分区间。这是通过将每个节点移动到链表的前端来完成的,这个过程通常称为头插法。

5. 循环的使用

  • 两个 for 循环被用来定位到需要反转的链表部分,以及执行实际的反转操作。

6. 边界条件的处理

  • 代码中通过 left - 1 和 right - left 来确定循环的次数,这样可以确保正确地定位到需要反转的链表区间,并且反转正确的节点数量。

7. 函数返回值

  • 函数返回 dummy.next,这是因为 dummy 是一个哑结点,它的 next 指针指向链表的真正头部。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

Java入门基础学习笔记15——强制类型转换

大范围类型的变量是否可以赋值给小范围类型的变量呢&#xff1f; IDEA直接报错。直接报错&#xff0c;是提醒你有问题。但是我非常进行类型转换。 非要强行赋值呢&#xff1f; 强制类型转换&#xff0c;强行将类型范围大的变量&#xff0c;数据赋值给类型范围小的变量。 数据…

简单的Python HTML 输出

1、问题背景 一名初学者在尝试将 Python 脚本输出到网页上时遇到了一些问题。他当前使用 Python 和 HTML 进行开发&#xff0c;并且遇到了以下问题&#xff1a; 担心自己的代码过于复杂&#xff0c;尤其是 WebOutput() 函数。希望通过 JavaScript 使用 HTML 模板文件更新数据。…

前端开发指导

前端开发指导 本文介绍了配置前端开发环境需要的软件、配置项等,指导如何开始进行UDM部门前端开发的全流程。本文以Windows系统下在Microsoft Virtual Studio Code中开发为基础。 一、综述 目标:零基础或者新员工依照此文档,能够完成开发环境的搭建及熟悉测试环境的搭建。…

【数据结构】顺序表(一)

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 不怕别人看不起&#xff0c;就怕自己不争气。路是人走出来的&#xff0c;关键要靠自己闯。振作起来&#xff0c;生活的含义就是前进。 目录 一、顺序表的概念&#xff1a; 二…

基于Laravel 10 + Vue(scui) + MySQL的快速开发的后台管理系统

​ 系统介绍 ​基于Laravel 10 Vue(scui) MySQL的快速开发的后台管理系统 版权申明 禁止将本产品用于含诈骗、赌博、色情、木马、病毒等违法违规业务使用。 代码仓库 gitee地址&#xff1a; 基础版本 内置模块 用户管理&#xff1a;用于维护管理系统的用户&#xff0c…

css案例 tab上下滚动,左右滚动

效果图&#xff1a; 完整代码&#xff1a; <template><view class"content"><view class"content-item"><view class"content-title"><h4>美食热搜</h4><ul><li>火鸡面</li><li>糖…

武汉星起航:掌握亚马逊关键节日,抢占销售制高点

在电子商务的浪潮中&#xff0c;亚马逊平台以其卓越的服务和庞大的用户基础&#xff0c;成为全球卖家争相入驻的热门选择。对于卖家而言&#xff0c;了解并掌握亚马逊的各大促销节日&#xff0c;无疑是提升销售业绩、扩大品牌影响力的重要一环。武汉星起航在这里将详细解析亚马…

大模型面试常考知识点1

文章目录 1. 写出Multi-Head Attention2. Pre-Norm vs Post-Norm3. Layer NormRMS NormBatch Norm 4. SwiGLU从ReLU到SwishSwiGLU 5. AdamW6. 位置编码Transformer位置编码RoPEALibi 7. LoRA初始化 参考文献 1. 写出Multi-Head Attention import torch import torch.nn as nn …

CLion 写 Rust 报Project directory `/Users/.../rsheets` does not exist.

每次打开CLion都会看到像下面这样的报错&#xff0c;Project directory /Users/.../rsheets does not exist.&#xff0c;虽然不会影响你写代码&#xff0c;但每次看到还是不舒服&#xff0c;所以研究一下怎么解决。 原因是这样的&#xff0c;每当我们创建一个 Cargo 项目&…

(已解决)org.springframework.amqp.rabbit.support.ListenerExecutionFailedException

报错截图 解决方案 1、登录rabbitMQ网址&#xff0c;删除所有队列 2、重启rabbitMQ 亲测有效&#xff01;&#xff01;&#xff01;亲测有效&#xff01;&#xff01;&#xff01;亲测有效&#xff01;&#xff01;&#xff01;

Unity射击游戏开发教程:(13)如何在Unity中播放音效

在本文中,我将向大家展示一些为游戏添加声音的不同方法。 我们为游戏添加声音的第一种方法是播放背景音乐。在此,我们将创建游戏对象(“音频管理器”)并创建一个子游戏对象(“背景音乐”)。该子游戏对象将是播放音乐的对象,因此需要向其添加音频源组件。如果没有音频源组…

halcon获取Licenses--每月一换

转到https://www.51halcon.com/ 点击授权&#xff0c;根据你的版本选择progress或者steady进行下载 记住每月一换哦