力扣刷题(第四十九天)
灵感来源
- 保持更新,努力学习
- python脚本学习
反转链表
解题思路
-
迭代法:通过遍历链表,逐个改变节点的指针方向。具体步骤如下:
- 使用三个指针:
prev
(初始为None
)、curr
(初始为头节点)、next_node
(用于保存当前节点的下一个节点)。 - 在遍历过程中,先保存当前节点的下一个节点,然后将当前节点的指针指向前一个节点,最后更新
prev
和curr
指针。 - 重复上述步骤,直到遍历完整个链表,此时
prev
指针即为新的头节点。
- 使用三个指针:
-
递归法:通过递归调用反转后续节点,然后调整当前节点的指针方向。具体步骤如下:
- 递归反转当前节点的后续链表。
- 将当前节点的下一个节点的指针指向当前节点。
- 将当前节点的指针置为
None
,避免形成环。# Definition for singly-linked list. class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass Solution:# 迭代方法def reverseList(self, head: ListNode) -> ListNode:prev = Nonecurr = headwhile curr:next_node = curr.next # 保存下一个节点curr.next = prev # 反转指针prev = curr # 移动prev指针curr = next_node # 移动curr指针return prev # 返回新的头节点# 递归方法def reverseListRecursive(self, head: ListNode) -> ListNode:if not head or not head.next:return head# 递归反转后续节点new_head = self.reverseListRecursive(head.next)# 调整指针方向head.next.next = headhead.next = Nonereturn new_head# 辅助函数:将列表转换为链表 def list_to_linkedlist(lst):dummy = ListNode(0)current = dummyfor val in lst:current.next = ListNode(val)current = current.nextreturn dummy.next# 辅助函数:将链表转换为列表 def linkedlist_to_list(head):result = []current = headwhile current:result.append(current.val)current = current.nextreturn result# 示例用法 if __name__ == "__main__":# 创建链表 1->2->3->4->5head = list_to_linkedlist([1, 2, 3, 4, 5])# 使用迭代方法反转链表solution = Solution()reversed_head = solution.reverseList(head)print("迭代方法反转后的链表:", linkedlist_to_list(reversed_head))# 重新创建链表 1->2->3->4->5head = list_to_linkedlist([1, 2, 3, 4, 5])# 使用递归方法反转链表reversed_head_recursive = solution.reverseListRecursive(head)print("递归方法反转后的链表:", linkedlist_to_list(reversed_head_recursive))
逐行解释
# Definition for singly-linked list.
class ListNode:def __init__(self, val=0, next=None):self.val = val # 当前节点的值self.next = next # 指向下一个节点的指针class Solution:# 迭代方法:通过遍历链表逐个反转指针方向def reverseList(self, head: ListNode) -> ListNode:prev = None # 初始化前一个节点为Nonecurr = head # 初始化当前节点为头节点while curr: # 遍历链表直到当前节点为空next_node = curr.next # 保存当前节点的下一个节点curr.next = prev # 将当前节点的指针指向前一个节点prev = curr # 前一个节点向后移动curr = next_node # 当前节点向后移动return prev # 返回新的头节点(原链表的尾节点)# 递归方法:通过递归反转后续节点,再调整当前节点的指针def reverseListRecursive(self, head: ListNode) -> ListNode:if not head or not head.next: # 递归终止条件:节点为空或为尾节点return head# 递归反转后续节点,返回新的头节点new_head = self.reverseListRecursive(head.next)# 调整指针方向:将当前节点的下一个节点的next指向当前节点head.next.next = head# 断开当前节点的next指针,防止形成环head.next = Nonereturn new_head # 返回新的头节点# 辅助函数:将列表转换为链表
def list_to_linkedlist(lst):dummy = ListNode(0) # 创建虚拟头节点current = dummy # 当前节点指向虚拟头节点for val in lst: # 遍历列表current.next = ListNode(val) # 创建新节点并连接current = current.next # 当前节点后移return dummy.next # 返回虚拟头节点的下一个节点,即真正的头节点# 辅助函数:将链表转换为列表
def linkedlist_to_list(head):result = [] # 初始化结果列表current = head # 当前节点指向头节点while current: # 遍历链表result.append(current.val) # 将当前节点的值添加到列表current = current.next # 当前节点后移return result # 返回结果列表# 示例用法
if __name__ == "__main__":# 创建链表 1->2->3->4->5head = list_to_linkedlist([1, 2, 3, 4, 5])# 使用迭代方法反转链表solution = Solution()reversed_head = solution.reverseList(head)print("迭代方法反转后的链表:", linkedlist_to_list(reversed_head))# 重新创建链表 1->2->3->4->5head = list_to_linkedlist([1, 2, 3, 4, 5])# 使用递归方法反转链表reversed_head_recursive = solution.reverseListRecursive(head)print("递归方法反转后的链表:", linkedlist_to_list(reversed_head_recursive))
相关文章:
力扣刷题(第四十九天)
灵感来源 - 保持更新,努力学习 - python脚本学习 反转链表 解题思路 迭代法:通过遍历链表,逐个改变节点的指针方向。具体步骤如下: 使用三个指针:prev(初始为None)、curr(初始为…...

机器学习:集成学习概念和分类、随机森林、Adaboost、GBDT
本文目录: 一、集成学习概念**核心思想:** 二、集成学习分类(一)Bagging集成(二)Boosting集成(三)两种集成方法对比 三、随机森林(一)构造过程(二…...

基于J2EE架构的在线考试系统设计与实现【源码+文档】
目录 摘要: Abstract: 1 引言 2 在线考试系统构架 2.1 在线考试系统一般需求分析 2.2 当前在线考试系统现状分析 2.3 基于J2EE的在线考试系统架构介绍及拥有的优势 2.3.1 结构总体介绍 2.3.2 客户层组件 2.3.2.1 Applets 2.3.2.2 应用程序客户端 2.3.3 …...
tpc udp http
TCP(传输控制协议)、UDP(用户数据报协议)和 HTTP(超文本传输协议)是网络通信中常用的三种协议,它们在不同的层次和场景中发挥作用。以下是对这三种协议的详细解释以及它们之间的区别:…...

联想拯救者R9000P 网卡 Realtek 8852CE Ubuntu/Mint linux 系统睡眠后,无线网卡失效
联想拯救者R9000P 网卡型号 Realtek PCle GbE Family Controller Realtek 8852CE WiFi 6E PCI-E NIC 系统版本 Ubuntu 24.04 / mint 22.1 问题现象 rtw89_8852ce,Link is Down,xtal si not ready,mac init fail,xtal si not …...

Python训练营打卡 Day46
道注意力(SE注意力) 知识点回顾: 不同CNN层的特征图:不同通道的特征图什么是注意力:注意力家族,类似于动物园,都是不同的模块,好不好试了才知道。通道注意力:模型的定义和插入的位置通道注意力后…...

解决微软应用商店 (Microsoft store) 打不开,无网络连接的问题!
很多小伙伴都会遇见微软应用商店 (Microsoft store)打开后出现无网络的问题,一般出现这种问题基本都是因为你的电脑安装了某些银行的网银工具,因为网银工具为了安全会关闭Internet 选项中的最新版本的TLS协议,而微软商店又需要最新的TLS协议才…...

《影像引导下骨盆创伤手术的术前骨折复位规划:基于学习的综合流程》|文献速递-深度学习医疗AI最新文献
Title 题目 Preoperative fracture reduction planning for image-guided pelvic trauma surgery: A comprehensive pipeline with learning 《影像引导下骨盆创伤手术的术前骨折复位规划:基于学习的综合流程》 01 文献速递介绍 《影像引导下骨盆创伤手术的术前…...

如何使用Webhook触发器,在 ONLYOFFICE 协作空间构建智能工作流
在数字化办公中,ONLYOFFICE 协作空间作为一款功能强大的文档协作平台,提供了丰富的自动化功能。对于开发者而言,Webhook 触发器是实现业务流程自动化与系统集成的关键工具。本文将深入探讨如何在 ONLYOFFICE 协作空间中高效利用 Webhook&…...
跟我学c++中级篇——理解类型推导和C++不同版本的支持
一、类型推导 在前面反复分析过类型推导(包括前面提到的类模板参数推导CTAD),类型推导其实就是满足C语言这种强类型语言的要求即编译期必须确定对象的数据类型。换一句话说,理论上如果编译器中能够自动推导所有的相关数据类型&am…...

什么是DevOps智能平台的核心功能?
在数字化转型的浪潮中,DevOps智能平台已成为企业提升研发效能、加速产品迭代的核心工具。然而,许多人对“DevOps智能平台”的理解仍停留在“自动化工具链”的表层概念。今天,我们从一个真实场景切入:假设你是某互联网公司的技术负…...

Windows账户管理,修改密码,创建帐户...(无需密码)
前言 我们使用wWindows操作系统时,账户是非常重要的概念 它不仅能够帮助我们区分文档主题权限等等 嗯还有最重要的解锁电脑的作用! 但想要管理他,不仅需要原本的密码,而且设置中的管理项也非常的不全。 Windows有一款netplwi…...
软件功能模块归属论证方法
文章目录 **一、核心设计原则****二、论证方法****三、常见决策模式****四、验证方法****五、反模式警示****总结** 在讨论软件功能点应该归属哪些模块时,并没有放之四海而皆准的固定方法,但可以通过系统化的论证和设计原则来做出合理决策。以下是常见的…...

【Java后端基础 005】ThreadLocal-线程数据共享和安全
📚博客主页:代码探秘者 ✨专栏:文章正在持续更新ing… ✅C语言/C:C(详细版) 数据结构) 十大排序算法 ✅Java基础:JavaSE基础 面向对象大合集 JavaSE进阶 Java版数据结构JDK新特性…...

【C语言】C语言经典小游戏:贪吃蛇(下)
文章目录 一、游戏前准备二、游戏开始1、游戏开始函数(GameStart)1)打印欢迎界⾯(WelcomeToGame)2)创建地图(CreateMap)3)初始化蛇⾝(InitSnake)4…...

NTT印地赛车:数字孪生技术重构赛事体验范式,驱动观众参与度革命
引言:数字孪生技术赋能体育赛事,开启沉浸式观赛新纪元 在传统体育赛事观赛模式遭遇体验天花板之际,NTT与印地赛车系列赛(NTT INDYCAR SERIES)的深度合作,通过数字孪生(Digital Twin)…...

30.【新型数据架构】-区块链数据架构
30.【新型数据架构】-区块链数据架构:分布式账本,不可篡改性,用于数据溯源 一、区块链数据架构的本质:分布式账本的革新 区块链的核心是分布式账本技术(Distributed Ledger Technology, DLT),它颠覆了传统中心化数据库的架构模式: 去中心化存储: 账本数据不再集中存储…...
使用docker 安装Redis 带配置文件(x86和arm)版本
一、安装redis 1.1 拉去ARM镜像(7.4.2) docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_redis:latest1.2 拉去x86镜像(8.0.1)版本 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest新建文件夹 mkd…...

在CSDN发布AWS Proton解决方案:实现云原生应用的标准化部署
引言:云原生时代的部署挑战 在云原生应用开发中,基础设施管理的复杂性已成为团队面临的核心挑战。随着微服务架构的普及,每个服务可能包含数十个AWS资源(如Lambda、API Gateway、ECS集群等),传统的手动配置…...
小白的进阶之路系列之十----人工智能从初步到精通pytorch综合运用的讲解第三部分
本文将介绍Autograd基础。 PyTorch的Autograd特性是PyTorch灵活和快速构建机器学习项目的一部分。它允许在一个复杂的计算中快速而简单地计算多个偏导数(也称为梯度)。这个操作是基于反向传播的神经网络学习的核心。 autograd的强大之处在于它在运行时动态地跟踪你的计算,…...
[蓝桥杯]整理玩具
整理玩具 题目描述 小明有一套玩具,一共包含 NMNM 个部件。这些部件摆放在一个包含 NMNM 个小格子的玩具盒中,每个小格子中恰好摆放一个部件。 每一个部件上标记有一个 0 ~ 9 的整数,有可能有多个部件标记相同的整数。 小明对玩具的摆放有…...

C++11 Move Constructors and Move Assignment Operators 从入门到精通
文章目录 一、引言二、基本概念2.1 右值引用(Rvalue References)2.2 移动语义(Move Semantics) 三、移动构造函数(Move Constructors)3.1 定义和语法3.2 示例代码3.3 使用场景 四、移动赋值运算符ÿ…...
JavaScript 中的单例内置对象:Global 与 Math 的深度解析
JavaScript 中的单例内置对象:Global 与 Math 的深度解析 在 JavaScript 的世界中,单例内置对象是开发者必须了解的核心概念之一。它们是语言规范中预定义的对象,无需显式创建即可直接使用。本文将深入解析 JavaScript 中最重要的两个单例内…...

11 - ArcGIS For JavaScript -- 高程分析
这里写自定义目录标题 描述代码实现结果 描述 高程分析是地理信息系统(GIS)中的核心功能之一,主要涉及对地表高度数据(数字高程模型, DEM)的处理和分析。 ArcGIS For JavaScript4.32版本的发布,提供了Web端的针对高程分析的功能。 代码实现 <!doct…...

通道注意力
一、 什么是注意力 其中注意力机制是一种让模型学会「选择性关注重要信息」的特征提取器,就像人类视觉会自动忽略背景,聚焦于图片中的主体(如猫、汽车)。 transformer中的叫做自注意力机制,他是一种自己学习自己的机制…...

2048游戏的技术实现分析-完全Java和Processing版
目录 简介Processing库基础项目构建指南项目结构核心数据结构游戏核心机制图形界面实现性能优化代码详解设计模式分析测试策略总结与展望简介 2048是一款由Gabriele Cirulli开发的经典益智游戏。本文将深入分析其Java实现版本的技术细节。该实现使用了Processing库来创建图形界…...

全国县域统计年鉴PDF-Excel电子版-2022年
全国县域统计年鉴PDF-Excel电子版-2022年.ziphttps://download.csdn.net/download/2401_84585615/89784662 https://download.csdn.net/download/2401_84585615/89784662 《中国县域统计年鉴》是一部全面反映中国县域社会经济发展状况的资料性年鉴。自2014年起,该年…...
平滑技术(数据处理,持续更新...)
一.介绍 “平滑”是一种用于减少数据中的短期波动、噪声或者异常值的技术,从而更清晰地揭示数据的长期趋势或周期性特征。 平滑的主要作用: 1.减少噪声。数据中常常包含各种随机噪声或误差,这些误差可能会掩盖数据的真实趋势。平滑可以降低…...
App 上线后还能加固吗?iOS 应用的动态安全补强方案实战分享(含 Ipa Guard 等工具组合)
很多开发者以为 App 一旦上线,安全策略也就定型了。但现实是,App 上线只是攻击者的起点——从黑产扫描符号表、静态分析资源文件、注入调试逻辑,到篡改功能模块,这些行为都可能在你“以为很安全”的上线版本里悄然发生。 本篇文章…...

gitlab CI/CD本地部署配置
背景: 代码管理平台切换为公司本地服务器的gitlab server。为了保证commit的代码至少编译ok,也为了以后能拓展test cases,现在先搭建本地gitlab server的CI/CD基本的编译job pipeline。 配置步骤: 先安装gitlab-runner: curl -L "ht…...