python反转单链表算法题

使用python实现反转单链表,可以分为迭代和递归两种方法。

迭代解法

迭代解法需要用到三个指针,分别是pre、cur和tmp。pre指向已翻转的链表,cur指向待翻转的链表,tmp用于保存cur的下一个节点。具体步骤如下:

  1. 定义pre为None,并将cur指向head节点。
  2. 遍历链表,当cur不为None时执行以下操作:
  3. 将tmp指向cur的下一个节点。
  4. 将cur的next指针指向pre节点。
  5. 将pre指向当前节点cur。
  6. 将cur指向tmp。
  7. 遍历结束时,pre指向已经反转后的链表。返回pre作为新链表的头节点即可。

示例:

假设链表为1 -> 2 -> 3 -> 4 -> 5,进行反转操作后,链表变为5 -> 4 -> 3 -> 2 -> 1。

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverseList(head: ListNode) -> ListNode:
    pre = None
    cur = head
    while cur:
        tmp = cur.next
        cur.next = pre
        pre = cur
        cur = tmp
    return pre

递归解法

递归解法相对于迭代解法更为简洁,思路也更为清晰。递归解法的主要思路是先递归到链表的末端,然后再依次反转链表。具体步骤如下:

  1. 如果链表为空或仅包含一个节点,则返回该链表。
  2. 递归到链表的末端,返回新的链表头节点。
  3. 依次反转每个节点的next指针指向前一个节点。
  4. 返回新的链表头节点。

示例:

假设链表为1 -> 2 -> 3 -> 4 -> 5,进行反转操作后,链表变为5 -> 4 -> 3 -> 2 -> 1。

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverseList(head: ListNode) -> ListNode:
    if not head or not head.next:
        return head
    p = reverseList(head.next)
    head.next.next = head
    head.next = None
    return p

以上就是python反转单链表算法题的两个解法,递归解法相比迭代解法的代码量更少且更易理解,但是递归会消耗较多的堆栈空间,当链表过长时,容易导致栈溢出的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python反转单链表算法题 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Vue自定义v-has指令,做按钮权限判断的步骤

    下面是详细讲解“Vue自定义v-has指令,做按钮权限判断的步骤”的完整攻略。 什么是Vue自定义v-has指令? 在Vue中,通过自定义指令来扩展Vue的功能。我们通过自定义指令 v-has 来控制按钮级别的权限,当某个按钮没有权限时,我们可以通过这个指令让这个按钮隐藏或者不可点击。 自定义指令v-has实现步骤 注册自定义指令 在Vue中,可以通过 Vu…

    other 2023年6月25日
    00
  • python中面向对象的注意点概述总结

    Python中面向对象的注意点概述总结 面向对象编程(Object-Oriented Programming,简称OOP)是一种常用的编程范式,Python也支持面向对象编程。在使用Python进行面向对象编程时,有一些注意点需要特别关注。本文将详细讲解Python中面向对象的注意点,并提供两个示例说明。 1. 类的定义和实例化 在Python中,类是对象的…

    other 2023年8月8日
    00
  • vb的if和elseif

    以下是VB的if和elseif的完整攻略,包含两个示例说明: if语句 if语句是VB中最基本的条件语句,用于根据条件执行不同的代码块。以下是if语句的语法: If condition Then ‘ code to execute if condition is true End If 其中,condition是一个布尔表达式,如果为True,则执行Then…

    other 2023年5月9日
    00
  • C语言修炼之路一朝函数思习得 模块思维世间生下篇

    C语言修炼之路一朝函数思习得 模块思维世间生下篇攻略 简介 本攻略旨在帮助初学者掌握C语言中的函数思维和模块思维,从而提升编程能力和代码的可维护性。以下是攻略的详细步骤。 步骤 1. 理解函数思维 函数是C语言中的基本构建块,具有独立的功能和输入输出。通过函数,我们可以将程序分解为更小的、可重用的模块,提高代码的可读性和可维护性。 示例1: 计算两个数的和 …

    other 2023年7月28日
    00
  • 使用postman进行接口测试的方法(测试用户管理模块)

    以下是使用Postman进行接口测试的完整攻略,以测试用户管理模块为例。 1. 下载并安装Postman 首先,我们需要下载并安装Postman,下载地址为 https://www.postman.com/downloads/ 2. 添加测试环境 在Postman中添加一个新的测试环境,点击左上角“环境Quick Look”下方的“Edit”,输入环境名称,…

    other 2023年6月27日
    00
  • response文件流输出文件名中文不显示的解决

    当使用response对象将文件流输出到客户端时,有时可能会遇到中文文件名不显示的问题。这种问题通常是由于字符集编码不兼容所致。下面是解决这个问题的一些方法: 方法一:设置Response头部 我们可以设置response头部的Content-Disposition属性,来指定文件名的字符编码和文件名。 示例代码: Response.AddHeader(&q…

    other 2023年6月26日
    00
  • Excel表格Ctrl+E都有哪些功能 Excel表格Ctrl+E功能介绍

    Excel表格Ctrl+E功能介绍 在Excel表格中,Ctrl+E是一个常用的快捷键,它提供了一些有用的功能。下面是Ctrl+E的功能介绍: 1. 快速选择当前区域 按下Ctrl+E快捷键后,Excel会自动选择当前区域。这对于快速选定一大块数据非常有用。例如,你可以使用Ctrl+E来选择一个表格中的整个列或行。 示例说明: 假设你有一个包含数据的表格,你…

    other 2023年8月5日
    00
  • Ubuntu下android adb环境变量配置方法

    以下是“Ubuntu下android adb环境变量配置方法”的完整攻略: 1. 下载安装adb工具 首先需要下载android adb工具,可以从官网下载对应的压缩包并解压,或者可以使用命令行: sudo apt-get install adb 若已安装了Android Studio,则可以在Android Studio的安装目录下找到adb工具,位置为:…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部