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 cfp

def reverseList_base(head):
 if head == None:
     return None
 nodelist = []
 nodecurr = head
 while nodecurr is not None:
     nodelist.append(nodecurr)
     nodecurr = nodecurr.next
 for iIdx in range(len(nodelist)):
     if iIdx == 0:
         nodelist[iIdx].next = None
     else:
         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 cfp

def reverseList_ext1(head):
 nodeprev = None
 nodecurr = head
 while nodecurr is not None:
     next_node = nodecurr.next
     nodecurr.next = nodeprev
     nodeprev = nodecurr
     nodecurr = next_node
 return nodeprev

result = 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 cfp

def reverselist_ext2(head):
 def revnode(node, pre):
     if not node:
         return pre
     revn = revnode(node.next, node)
     node.next = pre
     return 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 = head
    for num in data:
        new_node = ListNode(num)
        current_node.next = new_node
        current_node = new_node
    return 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 ~

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

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

相关文章

C#监听QQ消息自动回复-QQ自动化

整理 | 小耕家的喵大仙 出品 | CSDN&#xff08;ID&#xff1a;lichao19897314&#xff09; Q Q | 978124155 关于项目背景和微信自动化学习介绍 因为前面写了很多关于微信自动化的文章&#xff0c;网上有一位网友说他是做培训行业的&#xff0c;有时候除了微信对接客户还需要…

druid配置wall导致无法批量sql

1、现象 2、原配置 spring:autoconfigure:exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfiguredatasource:druid:stat-view-servlet:enabled: trueloginUsername: ***loginPassword: ***allow:web-stat-filter:enabled: truedynamic:druid: #…

kakfa系统架构

消息队列Kafka系统架构 Q:什么是Kafka&#xff1f; A&#xff1a;Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息引擎、消息队列服务&#xff0c;它可以处理消费者规模的网站中的所有动作流数据。…

【GameFramework框架】三、快速启动

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

python常用pandas函数nlargest / nsmallest及其手动实现

目录 pandas库 Series和DataFrame nlargest和nsmallest 用法示例 代替方法 手动实现 模拟代码 pandas库 是Python中一个非常强大的数据处理库&#xff0c;提供了高效的数据分析方法和数据结构。它特别适用于处理具有关系型数据或带标签数据的情况&#xff0c;同时在时间…

动态库是怎么被加载的?

目录 1.动态库是如何被加载的&#xff1f; 2.那么虚拟地址和物理地址是如何映射的呢&#xff1f; 3.那么动态库的地址怎么来&#xff1f; 1.动态库是如何被加载的&#xff1f; 下面这个就是正常的进程是如何从磁盘中读取信息编译的&#xff1a; 而动态库就存储在共享区段&am…

Android简单支持项目符号的EditText

一、背景及样式效果 因项目需要&#xff0c;需要文本编辑时&#xff0c;支持项目符号&#xff08;无序列表&#xff09;尝试了BulletSpan&#xff0c;但不是很理想&#xff0c;并且考虑到影响老版本回显等因素&#xff0c;最终决定自定义一个BulletEditText。 先看效果&…

新春营销不间断,AI 整活更省心

新年、春节历来都是营销的大热节点&#xff0c;各种好物集、年货节、送礼清单比比皆是。这些新鲜玩法的背后是大量的品牌内容「弹药库」。 然而&#xff0c;品牌想在竞争激烈的新春季刷满存在感&#xff0c;并非易事。一方面&#xff0c;节日期间&#xff0c;消费者对于内容的审…

交叉验证之KFold和StratifiedKFold的使用(附案例实战)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

云计算、Docker、K8S问题

1 云计算 云计算作为一种新兴技术&#xff0c;已经在现代社会中得到了广泛应用。它以其高效、灵活和可扩展特性&#xff0c;成为了许多企业和组织在数据处理和存储方面的首选方案。 1.1 什么是云计算&#xff1f;它有哪些特点&#xff1f; 云计算是一种通过网络提供计算资源…

项目02《游戏-06-开发》Unity3D

基于 项目02《游戏-05-开发》Unity3D &#xff0c; 接下来做 背包系统的 存储框架 &#xff0c; 首先了解静态数据 与 动态数据&#xff0c;静态代表不变的数据&#xff0c;比如下图武器Icon&#xff0c; 其中&#xff0c;武器的名称&#xff0c;描述&#xff…

全网第一篇把Nacos配置中心客户端讲明白的

入口 我们依旧拿ConfigExample作为入口 public class ConfigExample {public static void main(String[] args) throws NacosException, InterruptedException {String serverAddr "localhost";String dataId "test";String group "DEFAULT_GROU…

搭建frp

1.frp 是什么&#xff1f; frp 是一款高性能的反向代理应用&#xff0c;专注于内网穿透。它支持多种协议&#xff0c;包括 TCP、UDP、HTTP、HTTPS 等&#xff0c;并且具备 P2P 通信功能。使用 frp&#xff0c;您可以安全、便捷地将内网服务暴露到公网&#xff0c;通过拥有公网…

解决nvrtc: error: invalid value for --gpu-architecture (-arch)

问题描述 在使用pytorch3d的时候&#xff0c;可以正常的import&#xff0c;但是在执行错误的使用就会报&#xff0c;nvrtc: error: invalid value for --gpu-architecture (-arch)&#xff0c;的错误&#xff0c;图片如下&#xff1a; 我的环境是&#xff1a; 显卡&#xff1…

精细管理药厂设备,制药机械设备管理平台系统助力生产提效

制药行业的复杂性要求对药品的品质和安全性进行严格控制&#xff0c;而这离不开高效管理各类机械设备。然而&#xff0c;随着制药企业规模的不断扩大和技术的迅猛进步&#xff0c;如何有效管理这些设备成为一个亟待解决的问题。在这一挑战面前&#xff0c;PreMaint制药机械设备…

Antd+React+react-resizable实现表格拖拽功能

1、先看效果 2、环境准备 "dependencies": {"antd": "^5.4.0","react-resizable": "^3.0.4",},"devDependencies": {"types/react": "^18.0.33","types/react-resizable": "^…

前端面试题——Vue的双向绑定

前言 双向绑定机制是Vue中最重要的机制之一&#xff0c;甚至可以说是Vue框架的根基&#xff0c;它将数据与视图模板相分离&#xff0c;使得数据处理和页面渲染更为高效&#xff0c;同时它也是前端面试题中的常客&#xff0c;接下来让我们来了解什么是双向绑定以及其实现原理。…

Python的包安装工具——pip命令大全

对于大多数使用Python的人来说&#xff0c;一定知道pip这个包安装工具&#xff0c;但是对pip可能还不是很了解&#xff0c;今天作者给大家介绍一下pip的命令&#xff0c;以方便灵活使用pip。 一、pip工具使用方法 pip的语法如下&#xff1a; pip [options] 式中&#xff1a…

InverseMatrix3D

InverseMatrixVT3D: An Efficient Projection Matrix-Based Approach for 3D Occupancy Prediction https://github.com/DanielMing123/InverseMatrixVT3D InverseMatrix3D过程总结如下&#xff1a; 1. 用2D backbone提取N个视角的多尺度图像特征&#xff0c;表示如下&#xf…

机器学习聚类算法

聚类算法是一种无监督学习方法&#xff0c;用于将数据集中的样本划分为多个簇&#xff0c;使得同一簇内的样本相似度较高&#xff0c;而不同簇之间的样本相似度较低。在数据分析中&#xff0c;聚类算法可以帮助我们发现数据的内在结构和规律&#xff0c;从而为进一步的数据分析…