Python算法题集_反转链表

 Python算法题集_反转链表

  • 题41:反转链表
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【列表反转】
    • 2) 改进版一【直接赋值】
    • 3) 改进版二【递归大法】
  • 4. 最优算法

本文为Python算法题集之一的代码示例

题41:反转链表

1. 示例说明

  • 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

    示例 1:

    img

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

    示例 2:

    img

    输入:head = [1,2]
    输出:[2,1]
    

    示例 3:

    输入:head = []
    输出:[]
    

    提示:

    • 链表中节点的数目范围是 [0, 5000]
    • -5000 <= Node.val <= 5000

    **进阶:**链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?


2. 题目解析

- 题意分解

  1. 本题为单向链表的反转
  2. 本题的主要计算有2处,1是链表遍历,2是指针修改
  3. 基本的解法是采用列表保存节点,然后单层循环反转,所以基本的时间算法复杂度为O(n)

- 优化思路

  1. 通常优化:减少循环层次

  2. 通常优化:增加分支,减少计算集

  3. 通常优化:采用内置算法来提升计算速度

  4. 分析题目特点,分析最优解

    1. 可以直接进行节点的指针微调

    2. 可以用递归法进行反转,不过递归法一向是重型代码,性能不会太好


- 测量工具

  • 本地化测试说明:LeetCode网站测试运行时数据波动很大,因此需要本地化测试解决这个问题
  • CheckFuncPerf(本地化函数用时和内存占用测试模块)已上传到CSDN,地址:Python算法题集_检测函数用时和内存占用的模块
  • 本题很难超时,本地化超时测试用例自己生成,详见【最优算法章节】

3. 代码展开

1) 标准求解【列表反转】

马马虎虎,超过44%在这里插入图片描述

import CheckFuncPerf as cfpdef reverseList_base(head):if head == None:return Nonenodelist = []nodecurr = headwhile nodecurr is not None:nodelist.append(nodecurr)nodecurr = nodecurr.nextfor iIdx in range(len(nodelist)):if iIdx == 0:nodelist[iIdx].next = Noneelse:nodelist[iIdx].next = nodelist[iIdx-1]return nodelist[-1]result = cfp.getTimeMemoryStr(reverseList_base, ahead)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))# 运行结果
函数 reverseList_base 的运行时间为 9.00 ms;内存使用量为 336.00 KB 执行结果 = 19999

2) 改进版一【直接赋值】

直接对节点进行赋值 指标优良,超过91%在这里插入图片描述

import CheckFuncPerf as cfpdef reverseList_ext1(head):nodeprev = Nonenodecurr = headwhile nodecurr is not None:next_node = nodecurr.nextnodecurr.next = nodeprevnodeprev = nodecurrnodecurr = next_nodereturn nodeprevresult = cfp.getTimeMemoryStr(reverseList_ext1, ahead)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))# 运行结果
函数 reverseList_ext1 的运行时间为 2.99 ms;内存使用量为 0.00 KB 执行结果 = 0

3) 改进版二【递归大法】

递归法从来都不是讲效率的,没办法 马马虎虎,超过58%在这里插入图片描述

import CheckFuncPerf as cfpdef reverselist_ext2(head):def revnode(node, pre):if not node:return prerevn = revnode(node.next, node)node.next = prereturn revn return revnode(head, None)result = cfp.getTimeMemoryStr(reverselist_ext2, ahead)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))# 运行结果	递归层次超过990,溢出报错
Traceback (most recent call last):......
[Previous line repeated 991 more times]
RecursionError: maximum recursion depth exceeded

4. 最优算法

根据本地日志分析,最优算法为第2种reverseList_ext1

# 超时测试代码
nums = [ x for x in range(20000)]
def generateOneLinkedList(data):head = ListNode()current_node = headfor num in data:new_node = ListNode(num)current_node.next = new_nodecurrent_node = new_nodereturn head.next
ahead = generateOneLinkedList(nums)
result = cfp.getTimeMemoryStr(reverseList_base, ahead)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))# 算法本地速度实测比较
函数 reverseList_base 的运行时间为 9.00 ms;内存使用量为 336.00 KB 执行结果 = 19999
函数 reverseList_ext1 的运行时间为 2.99 ms;内存使用量为 0.00 KB 执行结果 = 0
函数 reverseList_ext2 ==> 递归层次超过990,溢出报错,剥夺资格,囧
Traceback (most recent call last):......[Previous line repeated 991 more times]
RecursionError: maximum recursion depth exceeded

一日练,一日功,一日不练十日空

may the odds be ever in your favor ~

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

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

相关文章

ChatGPT~免费攻略【2024新春福利】

ChatGPT能干什么&#xff1f; 这个问题我也不好回答&#xff0c;于是看看ChatGPT怎么回答的如下图 从回答上看还是很抽象&#xff0c;不够具体。但能确定的是语言方面的理解和回答。当然也许是问题也太抽象了。 我们试试再具体的问题“如何才能学习到鸿蒙系统性开发技术” 换…

111.乐理基础-五线谱-五线谱的节奏型、打拍子

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;110.乐理基础-五线谱-五线谱的速度-CSDN博客 首先必须先看 打拍子 这些东西 简谱里的节奏型总结图&#xff1a; 换成五线谱的节奏型&#xff1a;简谱里会把两个八分音符用根横线连起来&#xff0c;所以五线谱里也…

2,cdc放缩位图

类似地&#xff0c;用pDC->StretchBlt来缩放&#xff0c;只是加上了两个参数&#xff0c;原始位图的宽高。 void CMy1_showbitmapView::StretchBitMap(CDC * pDC) { //CBitmap对象 CBitmap bitmap; //CDC对象 CDC dcMemory; //加载资源 bitmap.LoadBitmapW(IDB_BITMAP1); /…

Linux 线程与pthread库

Linux线程与pthread库 1. 线程和pthread库2. 线程的终止与退出3. 为什么需要线程库&#xff1f;4. 虚拟地址空间与线程库 在Linux系统中&#xff0c;线程控制是多任务编程的核心&#xff0c;而POSIX线程库&#xff08;pthread库&#xff09;则是应用层的原生线程库&#xff0c;…

【Zookeeper】what is Zookeeper?

官网地址&#xff1a;https://zookeeper.apache.org/https://zookeeper.apache.org/ 以下来自官网的介绍 ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. A…

FCIS 2023:洞悉网络安全新态势,引领创新防护未来

随着网络技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;成为全球共同关注的焦点。在这样的背景下&#xff0c;FCIS 2023网络安全创新大会应运而生&#xff0c;旨在汇聚业界精英&#xff0c;共同探讨网络安全领域的最新动态、创新技术和解决方案。 本文将从大会的…

全球HBM研发进展解析

HBM&#xff08;高带宽内存&#xff09;的整体发展趋势和各大厂商的研究进度&#xff1a; 整体发展趋势&#xff1a; 市场需求增长显著&#xff1a;随着AI、机器学习以及高性能计算应用的迅速发展&#xff0c;尤其是生成式AI技术对更高性能计算能力的需求&#xff0c;市场对HB…

Android学习之路(26) ARouter APT技术详解

APT前置知识 注解基础&#xff1a; 1.元注解 1.Target&#xff1a;目标&#xff0c;表示注解修饰的目标 ElementType.ANNOTIONS_TYPE: 目标是注解&#xff0c;给注解设置的注解ElementType.CONSTRUCTOR: 构造方法ElementType.FIELD: 属性注解ElementType.METHOD: 方法注解Ele…

使用mmrotate对自定义数据集进行检测

这里写自定义目录标题 安装虚拟环境创建与准备安装mmrotate 自定义数据集标注数据与格式转换数据集划分与大图像切片 训练与测试修改配置文件执行训练进行测试鸣谢 安装 mmrotate是一个自带工作目录的python工具箱&#xff0c;个人觉得&#xff0c;在不熟悉的情况下&#xff0…

虚拟机配置了静态ip地址后,通过ssh连接到虚拟机比较慢

配置了静态ip地址后&#xff0c;通过ssh连接到虚拟机比较慢 [rootlocalhost ~]# vim /etc/ssh/sshd_config#快速方式找到UsePAM&#xff0c;输入“/UsePAM”而后回车&#xff0c;直接跳到UsePAM位置&#xff0c;将yes修改成no #键盘输入" i "开始编译 #"Esc&qu…

2024 年你应该使用 Bun、Node.js 还是 Deno?

导读&#xff1a;在 2024 年&#xff0c;JavaScript 开发者面临着 Node.js、Deno 和 Bun 这三个主要运行环境的选择。Node.js 以其成熟的生态系统和高性能著称&#xff0c;但可能面临性能限制。Deno 强调安全性&#xff0c;提供改进的开发者体验&#xff0c;但生态系统尚不成熟…

你的歌声婉转入云霄

可爱的一朵玫瑰花 - 吕继宏 可爱的一朵玫瑰花塞地玛丽亚 可爱的一朵玫瑰花塞地玛丽亚 那天我在山上打猎骑着马&#xff08;人善被人欺马善被人骑&#xff09; 正当你在山下歌唱婉转入云霄 歌声使我迷了路 我从山坡滚下 哎呀呀 你的歌声婉转入云霄 强壮的青年哈萨克伊万杜达尔 …