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日

相关文章

  • 越狱后iPhone手机不断重启怎么办 越狱后iPhone手机不断重启解决方法

    越狱后iPhone手机不断重启解决方法 问题描述 越狱是指绕过苹果的保护机制,使得用户可以安装来自第三方应用商店的应用。但是,越狱后有时候可能会出现手机不断重启的情况,导致手机无法正常使用。 问题原因 造成越狱后iPhone手机不断重启的原因主要有以下两种: 1.问题应用:越狱后安装了不兼容的应用或者类库,导致系统崩溃,进而导致手机不断重启。 2.不完整的越…

    other 2023年6月27日
    00
  • bootstrap字体颜色设置菜鸟

    Bootstrap字体颜色设置 在Bootstrap中,可以使用预定义的类来设置字体颜色。本文将介绍如何使用Bootstrap设置字体颜色,并提供两个示例说明。 基本语法 以下是常用的Bootstrap字体颜色类: text-primary:设置字体颜色为主色调。 text-secondary:设置字体颜色为次要色调。 text-success:设置字体颜色…

    other 2023年5月7日
    00
  • openwrt防火墙配置(极路由)

    以下是“OpenWrt防火墙配置(极路由)”的完整攻略: OpenWrt防火墙配置(极路由) OpenWrt是一款开源的路由器操作系统,提供了丰富的网络功能和扩展性。防火墙是OpenWrt中的一个重要功能,可以保护网络安全。本攻略将详细讲解OpenWrt防火墙的配置方法,包括防火墙规则、端口转发、IP过滤等。 防火墙规则 防火墙规则是OpenWrt防火墙的核…

    other 2023年5月8日
    00
  • vue draggable组件实现拖拽及点击无效问题的解决

    Vue Draggable 组件实现拖拽及点击无效问题的解决攻略 标题 在这个攻略中,我们将详细讲解如何使用 Vue Draggable 组件实现拖拽功能,并解决由此引发的点击无效问题。 示例说明1: 基本拖拽功能 首先,我们需要安装 Vue Draggable 组件。可以通过以下命令在项目中进行安装: npm install vuedraggable 安装…

    other 2023年6月28日
    00
  • proe5.0怎么使用旋转命令旋转模型?

    Pro/E 5.0旋转命令的使用 在Pro/E 5.0中,旋转命令可以帮助用户沿自定义轴向旋转部件,以下是步骤和示例说明: 步骤: 1.在你的Pro/E图形窗口中选择要旋转的零件。 2.从菜单栏中或进行键盘快捷方式,使用“旋转”命令。“旋转”命令可以在 “目录栏 -> 变换 -> 旋转”中找到。 3.单击零件以选择它,然后输入旋转轴和旋转角度。轴…

    other 2023年6月27日
    00
  • el autocomplete支持分页上拉加载使用详解

    下面是详细讲解“el autocomplete支持分页上拉加载使用详解”的完整攻略: 什么是el autocomplete? el autocomplete 是 element-ui 组件库提供的可输入下拉选择框组件,可以根据用户输入的数据进行联想提示,提升用户的选择效率。当列表数据量很大的时候,很多时候我们希望能够进行分页和上拉加载,从而提高性能,减少一次…

    other 2023年6月25日
    00
  • system.data.sqlite.dll控件常规安装方法

    以下是详细讲解“system.data.sqlite.dll控件常规安装方法的完整攻略”: system.data.sqlite.dll控件常规安装方法 system.data.sqlite.dll是一个用于访SQLite数据库的.NET数据提供程序,可以在.NET应用程序中使用。本攻略将介绍system.data.sqlite.dll控件的常规安装方法。 …

    other 2023年5月10日
    00
  • 详解jQuery lazyload 懒加载

    详解jQuery lazyload 懒加载 什么是懒加载 懒加载是一种提高网站性能的技术,在用户浏览网页时,只加载当前页面可见的部分,而不是一次性加载全部内容。这种技术能够减少页面的请求次数,节约流量,并且加速页面的加载速度。 jQuery lazyload jQuery lazyload 是一款基于 jQuery 的懒加载插件,它可以延迟加载网页中的图片、…

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