链表中的经典问题——反转链表

经典问题

对于链表的结构还不太清晰的同学,可以看我的另一篇文章,实践总结:一篇搞懂链表——单链表和双指针技巧

反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
在这里插入图片描述

方法一,迭代法:
在遍历过程中,我们需要维护三个指针:prev(前一个节点),curr(当前节点),和 next_node(下一个节点)。下面是反转链表的步骤和代码实现:
1. 初始化三个指针:

  • prev 指针初始化为 None,因为在反转后的链表中,最后一个节点(原链表的头节点)将不会有任何节点指向它。
  • curr 指针初始化为 head,即链表的头节点,这是我们开始遍历的地方。
  • next_node 用于临时存储 curr.next,在改变 curr.next 之前。

2. 遍历链表,直到 curr 为 None(链表结束):

  • 在每次迭代中,首先保存 curr.next 到 next_node。
  • 然后,将 curr.next 指向 prev,这样当前节点就反转了它的指向。
  • 接下来,移动 prev 和 curr 指针到下一个节点。prev 变为 curr,curr 变为 next_node。

3. 当 curr 为 None 时,遍历结束,此时 prev 指向新的头节点。

# 迭代法
class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        # 定义
        prev=None
        curr=head
        while curr:
            new_node=curr.next
            curr.next=prev
            prev=curr
            curr=new_node
        return prev

迭代过程的图示展示可以参考这篇文章:看一遍就理解,图解单链表反转

方法二,递归法:

要使用递归的方式反转单链表,我们需要遵循以下步骤:

  1. 确定基本情况:如果链表为空(head 为 None)或者只有一个节点(head.next 为 None),则链表已经反转,直接返回 head。
  2. 递归地反转剩余的链表:对 head.next 进行递归调用,反转剩余的链表。
  3. 在递归调用之后,我们需要将当前节点(head)连接到新反转的链表的末尾。这可以通过将当前节点的 next 指针指向自己(head.next = head),然后将 head 的 next 指针设置为 None 来实现。
  4. 返回新链表的头节点,它将是原始链表的尾节点。
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def reverseListRecursive(self, head: Optional[ListNode]) -> Optional[ListNode]:
        # 基本情况:空链表或只有一个节点
        if head is None or head.next is None:
            return head
        
        # 递归地反转剩余的链表
        new_head = self.reverseListRecursive(head.next)
        
        # 将当前节点连接到新链表的末尾
        head.next.next = head
        head.next = None
        
        # 返回新链表的头节点
        return new_head

不明白的建议看下这个视频,只有三分多钟,讲的很清楚。链表反转(递归法)

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

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

相关文章

牛客周赛 Round 36

赛况 C题可惜,比赛时模拟没有想明白,只对了一半,赛后看了大佬们的题解后恍然大悟,而F题是压根没思路,况且F题部分分也比较难拿。 题目列表 A-小红的数位删除 思路 将读入的数字整除10做三次后输出即可 参考代码 #inc…

【数据结构】详解时间复杂度和空间复杂度的计算

一、时间复杂度(执行的次数) 1.1时间复杂度的概念 1.2时间复杂度的表示方法 1.3算法复杂度的几种情况 1.4简单时间复杂度的计算 例一 例二 例三 1.5复杂时间复杂度的计算 例一:未优化冒泡排序时间复杂度 例二:经过优化…

蓝桥杯备战刷题-滑动窗口

今天给大家带来的是滑动窗口的类型题,都是十分经典的。 1,无重复字符的最长子串 看例三,我们顺便来说一下子串和子序列的含义 子串是从字符串里面抽出来的一部分,不可以有间隔,顺序也不能打乱。 子序列也是从字符串里…

5分钟教你使用pyarmnn推理引擎识别一只可爱猫咪~

视频 5分钟教你使用pyarmnn推理引擎识别一只可爱猫咪~ 添加仓库 sudo apt install software-properties-common sudo add-apt-repository ppa:armnn/ppa sudo apt update 安装pyarmnn sudo apt-get install -y python3-pyarmnn armnn-latest-all python3-pip安装…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Checkbox)

提供多选框组件,通常用于某选项的打开或关闭。 说明: API version 11开始,Checkbox默认样式由圆角方形变为圆形。 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 无 接口…

Python(38):Request的data需入参是json,用转换json.dumps(data)

Python接口自动化测试遇到问题:误传str类型给request 一:request接口请求数据用str传参报错,请求响应报错 排查原因:查看服务器报错是Json解析报错。 1.1、如果直接入参,进行request请求的数据: data请求值为&…

C语言---单身狗问题

1.单身狗初阶 这个题目就是数组里面有一串数字,都是成对存在的,只有一个数字只出现了一次,请你找出来 (1)异或是满足交换律的,两个相同的数字异或之后是0; (2)让0和每个…

【LeetCode每日一题】299. 猜数字游戏

文章目录 [299. 猜数字游戏](https://leetcode.cn/problems/bulls-and-cows/)思路:代码: 299. 猜数字游戏 思路: 遍历两个字符串 secret 和 guess,若字符既在相同位置上又相等,则位置和数字都正确,对应的 …

如何对于单元格数据进行清洗处理

如何对于单元格数据进行清洗处理 陪伴意味着有人愿意把最美好的东西给你, 那就是时间。 当然陪伴也是一个很平常的事情, 日复一日,年复一年。 到最后陪伴就成了一种习惯。 约定好的相逢,伴你天荒地老! 陪伴是最长情的告…

多线程多进程处理服务器并发(多进程处理如何解决僵死进程)

目录 1.可循环发送数据的代码 2.改成循环之后每次发现只能处理一个客户端 3.服务器端处理并发问题 3.1 思路 3.2 利用多线程实现并发 ​编辑 3.3 利用多进程实现并发 3.3.1 多进程并发产生的僵死进程问题 ​3.3.2 解决僵死进程问题 1.可循环发送数据的代码 服务器代…

AI代码加速器即将发布!傅盛:程序员会写某种代码就能找到工作的时代一去不复返了

在产品介绍视频的最后,代码加速器运行了Prompt生成的代码,是一个为傅盛庆生的祝福“彩蛋”。不得不说,猎户星空的程序员就做到了傅盛说的不止写代码,真是有点浪漫小心机在身上的。 3月6日,猎豹移动董事长兼CEO、猎户星…

木球竞赛抽签计分系统(C# Winform)

前几天做了个小系统,木球竞赛抽签计分系统。种子的设置,和轮空的设置,都是按照运动抽签的规则。目前仅支持8位,16位, 32位,64位报表的生成。 功能模块: 1、比赛管理:名称、承办、时间、地点 2…

使用Certbot解决https证书自动更新的问题

除了各个第三方博客平台之外,我还一直保有一个自建的博客网站https://zxs.io/,还有几个其他的域名用做小工具之类的,之前一直使用阿里云免费https证书,一次申请可以用一年,但现在阿里云免费证书缩短到3个月了&#xff…

云上攻防-云产品篇堡垒机场景JumpServer绿盟SASTeleport麒麟齐治

知识点 1、云产品-堡垒机-产品介绍&攻击事件 2、云产品-堡垒机-安全漏洞&影响产品 章节点: 云场景攻防:公有云,私有云,混合云,虚拟化集群,云桌面等 云厂商攻防:阿里云,腾讯…

【网络工程设计】交换网络技术

📝本文介绍 本文主要介绍使用GNS3和VMware来构件一个简单的交换网络 👋作者简介:一个正在积极探索的本科生 📱联系方式:943641266(QQ) 🚪Github地址:https://github.com/sankexilianhua &#x…

【MySQL篇】 MySQL基础学习

文章目录 前言基础数据类型DDL数据库操作查询数据库创建数据库删除数据库使用数据库 DDL表操作创建表查询表修改表删除 DML-增删改添加数据更改数据删除数据 DQL-查询基础查询条件查询聚合函数分组查询排序查询分页查询编写顺序 DML-用户及权限用户管理权限控制 函数字符串函数…

修复网络适配器不工作的14种方法,总有一种适合你

网络适配器是将设备连接到internet或其他计算机的关键硬件组件。如果设备发生故障,你可能会面临连接速度慢的问题,在最坏的情况下,互联网将完全停止工作。 这可能是由于损坏的驱动程序、冲突的设备、配置错误的设置,甚至是硬件故障!但也有可能出现互联网问题,使你认为网…

22.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-加载配置文件到分析工具界面

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 内容参考于:易道云信息技术研究院VIP课 上一个内容:21.配置数据保存…

【java+vue】前后端项目架构详细流程

前端 1.创建vue项目 需要工具:node、Vscode 1.在磁盘上创建文件(web),并移到Vscode的工作区 2.进入该文件的终端 3.检测node和vue是否正常,若不显示版本号,则自行下载 4.生成vue 1.执行命令:…

JavaScript中的Set和Map:理解与使用

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…