92. 反转链表 II (Swift 版本)

题目描述

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

分析

这是一个经典的链表问题,要求反转链表的部分节点。我们可以通过以下步骤实现:

  1. 定位到需要反转的部分的前一个节点。
  2. 反转从 leftright 之间的节点。
  3. 连接反转后的部分与链表的其他部分。

具体的代码实现 (Swift)

class ListNode {
    var val: Int
    var next: ListNode?
    init(_ val: Int) {
        self.val = val
        self.next = nil
    }
}

func reverseBetween(_ head: ListNode?, _ left: Int, _ right: Int) -> ListNode? {
    // 边界条件
    if head == nil || left == right {
        return head
    }
    
    // 创建哑节点,方便处理头节点变更
    let dummy = ListNode(0)
    dummy.next = head
    var prev: ListNode? = dummy
    
    // 移动 prev 到 left 之前的位置
    for _ in 1..<left {
        prev = prev?.next
    }
    
    // 开始反转的起点
    let start = prev?.next
    var then = start?.next
    
    // 反转节点
    for _ in 0..<(right - left) {
        start?.next = then?.next
        then?.next = prev?.next
        prev?.next = then
        then = start?.next
    }
    
    return dummy.next
}

// 辅助函数:打印链表
func printList(_ head: ListNode?) {
    var current = head
    while current != nil {
        print(current!.val, terminator: " ")
        current = current?.next
    }
    print()
}

// 测试用例
let head = ListNode(1)
head.next = ListNode(2)
head.next?.next = ListNode(3)
head.next?.next?.next = ListNode(4)
head.next?.next?.next?.next = ListNode(5)

print("原链表:")
printList(head)

let left = 2
let right = 4

let result = reverseBetween(head, left, right)
print("反转后链表:")
printList(result)

代码解释:

  1. 边界条件处理:如果 headnilleft 等于 right,直接返回 head,因为不需要反转。
  2. 哑节点:创建一个哑节点(dummy node),指向链表的头部,以方便处理头节点变更的情况。
  3. 定位到反转起点的前一个节点:使用 prev 指针定位到 left 位置的前一个节点。
  4. 反转链表部分节点:通过改变节点的 next 指针,逐步反转 leftright 之间的节点。
  5. 返回新链表头:反转操作完成后,返回新的链表头,即 dummy.next

这段代码可以正确地反转链表中指定位置之间的节点,并通过辅助函数 printList 打印链表以验证结果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux -- 认识gcc/g++、代码的编译过程

目录 前言&#xff1a; 使用 gcc/g&#xff1a; 代码的编译过程&#xff1a; 预处理&#xff1a; 头文件展开&#xff1a; 宏替换去注释&#xff1a; ​编辑 条件编译&#xff1a; 编译&#xff1a; 汇编&#xff1a; 链接&#xff1a; 动态库&#xff08;动态链…

高速公路事故检测数据集点亮智能交通:视频动作识别的崭新征程(目标检测)

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 引言 …

spring tx @Transactional 详解 `Advisor`、`Target`、`ProxyFactory

在Spring中&#xff0c;Transactional注解的处理涉及到多个关键组件&#xff0c;包括Advisor、Target、ProxyFactory等。下面是详细的解析和代码示例&#xff0c;解释这些组件是如何协同工作的。 1. 关键组件介绍 1.1 Advisor Advisor是一个Spring AOP的概念&#xff0c;它包…

射频硅基氮化镓:两个世界的最佳选择

当世界继续努力追求更高速的连接&#xff0c;并要求低延迟和高可靠性时&#xff0c;信息通信技术的能耗继续飙升。这些市场需求不仅将5G带到许多关键应用上&#xff0c;还对能源效率和性能提出了限制。5G网络性能目标对基础半导体器件提出了一系列新的要求&#xff0c;增加了对…

如何使用ParaView可视化工具来绘制点云数据的3D点云图像(亲测好用)

如何使用ParaView来绘制点云数据。以下是如何将你的数据导入ParaView并进行可视化的步骤 一、准备数据 首先&#xff0c;你需要将你的数据转换为ParaView可以读取的格式。ParaView支持多种文件格式&#xff0c;其中最常见的是.vtk和.csv格式。为了简单起见&#xff0c;这里我…

JFlash读取和烧录加密stm32程序

JFlash读取和烧录加密stm32程序 安装后JFlash所在的目录&#xff1a;C:\Program Files\SEGGER\JLink 一、烧写加密程序 1、打开C:\Program Files\SEGGER\JLink目录&#xff0c;找到JFlash.exe,双击它&#xff0c;就可以打开该执行程序。见下图&#xff1a; 2、选择“Create …

华为eNSP:HCIA综合实验

一实验要求 HCIA综合实验的配置要求&#xff1a; 1.ISP路由器只能配置IP地址&#xff0c;之后不进行任何配置 2.内部整个网络基于192.168.1.0/24进行地址划分 3.R1/2之间启动OSPF协议&#xff0c;单区域 4.PC1-4自动获取IP地址 5.PC1-4&#xff0c;可以访问PC5&#xff0c;R2…

布隆过滤器 redis

一.为什么要用到布隆过滤器&#xff1f; 缓存穿透&#xff1a;查询一条不存在的数据&#xff0c;缓存中没有&#xff0c;则每次请求都打到数据库中&#xff0c;导致数据库瞬时请求压力过大&#xff0c;多见于爬虫恶性攻击因为布隆过滤器是二进制的数组&#xff0c;如果使用了它…

9.2 栅格图层符号化单波段灰度渲染

文章目录 前言单波段灰度QGis设置为单波段灰度二次开发代码实现单波段灰度 总结 前言 介绍栅格图层数据渲染之单波段灰度显示说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 单波段灰度 以“3420C_2010_327_RGB_LATLNG.tif”数据为例&#xff0c;在QGis中…

RTK_ROS_导航(2):卫星图查看

目录 1. 基于MapViz的卫星图查看 1. 基于MapViz的卫星图查看 安装 # 源码安装 mkdir -p RTK_VISION/src cd RTK_VISION/src git clone https://github.com/swri-robotics/mapviz.git --branchmelodic-eol sudo apt-get install ros-$ROS_DISTRO-mapviz ros-$ROS_DISTRO-mapviz-…

Idea-单个窗口导入并开启多个module项目

前言 大家是否有过这样的困扰&#xff0c;我们每次打开一个项目就需要单开一个idea窗口&#xff0c;项目少时了还好&#xff0c;一旦涉及多个项目间服务调用&#xff0c;特别是再包括网关、注册中心、前端web服务&#xff0c;需要开启的窗口就会是一大批&#xff0c;每次切换的…

B端全局导航:左侧还是顶部?不是随随便便,有依据在。

一、什么是全局导航 B端系统的全局导航是指在B端系统中的主要导航菜单&#xff0c;它通常位于系统的顶部或左侧&#xff0c;提供了系统中各个模块和功能的入口。全局导航菜单可以帮助用户快速找到和访问系统中的各个功能模块&#xff0c;提高系统的可用性和用户体验。 全局导航…

二叉树树的知识,选择➕编程

在一棵深度为7的完全二叉树中&#xff0c;可能有多少个结点&#xff1f;&#xff08;1层深度为1&#xff0c;节点个数为1&#xff09; 对于深度 d的完全二叉树&#xff1a; 完全二叉树中&#xff0c;前 d−1层是满的。 最后一层&#xff08;第 d 层&#xff09;可以不满&#x…

【vue3|第16期】初探Vue-Router与现代网页路由

日期:2024年7月6日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083…

前端工程师

15年前&#xff0c;前端主流的框架jquery&#xff0c;那个时候还没有前端工程师,后端开发人员既要写后台业务逻辑&#xff0c;又要写页面设计&#xff0c;还要应付IE不同版本浏览器兼容问题&#xff0c;非常的繁琐、难搞。 现在前端框架很多、很强大&#xff0c;前端开发工程师…

MySQL——第一次作业

部署MySQL 8.0环境 1&#xff0c;删除之前存在的MySQL程序 控制面板删除 2&#xff0c;删除完成后下载MySQL 官网&#xff1a; https://www.mysql.com 在window下下载MSI版本 3&#xff0c;自定义安装 4&#xff0c;配置环境变量 1&#xff0c;系统高级系统设置 2&#xff…

YOLOV8 + PYQT5单目测距—风险类别检测(五)

YOLOV8 PYQT5单目测距 1. 相关配置2. 测距源码3. PYQT环境配置4. 实验结果4.1 界面4.2 界面卡住解决方案 5. 实现效果 1. 相关配置 系统&#xff1a;win 10 YOLO版本&#xff1a;yolov8 拍摄视频设备&#xff1a;安卓手机 电脑显卡&#xff1a;NVIDIA 2080Ti&#xff08;CPU也…

【Python】 已解决:ValueError: document with multiple roots

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;ValueError: document with multiple roots 一、分析问题背景 在Python编程中&#xff0c;处理XML或HTML文档时&#xff0c;有时会遇到“ValueError: document …

安防监控视频平台LntonAIServer视频智能分析平台行人入侵检测算法

在当今社会&#xff0c;随着科技的迅速发展和安全需求的日益增长&#xff0c;行人入侵检测技术成为了安全防护领域的重要研究方向。LntonAIServer行人入侵检测算法作为该领域的先进技术之一&#xff0c;其性能和应用效果受到了广泛关注。 首先&#xff0c;从技术角度来看&#…

【线程安全】线程互斥的原理

文章目录 Linux线程互斥线程互斥相关概念互斥量mutex引出线程并发问题引出互斥锁、互斥量 互斥量的接口初始化互斥量销毁互斥量互斥量加锁和解锁使用互斥锁抢票 可重入和线程安全概念&#xff1a;常见线程不安全的情况常见线程安全的情况常见不可重入的情况常见可重入情况可重入…