基于Python实现2种反转链表方法代码实例

yizhihongxing

当我们需要对链表进行反转的时候,在Python中有很多种实现方式。本文将详细阐述两种反转链表的实现方法及其代码实例。

方法一:反转链表法

反转链表是最基础的一种方法,其实现思路很简单,就是对链表中的每个节点按照它们的next指针进行反转。首先我们定义一个新的链表头节点,然后遍历原始链表,每遍历到一个节点就将其作为头节点的下一节点,同时将其从原链表中删除。这样就能实现链表的反转。

代码实例:

class Node(object):
    def __init__(self, val):
        self.val = val
        self.next = None

class Solution(object):
    def reverseList(self, head):
        new_head = None
        while head:
            tmp = head.next
            head.next = new_head
            new_head = head
            head = tmp
        return new_head

以上代码中,我们首先定义了一个Node类来表示链表中的节点,每个节点都具有一个值val和一个next指针,指向链表中的下一节点。然后我们实现了一个Solution类,其中reverseList方法接收链表的头节点head作为参数,其返回值为反转后的链表的头节点new_head。

在while循环中,我们不断遍历原链表。定义临时变量tmp作为head节点的next指针,来记录下一个节点。然后将head节点指向new_head,将new_head更新为head节点,最后将head节点指向tmp节点。这样遍历结束后,new_head就成为了原链表的反转链表。

方法二:递归反转链表法

递归反转链表法是另一种实现反转链表的方法,它的实现思路是通过递归实现反转链表。具体实现追溯到链表的末尾,然后反向遍历链表,每次修改链表的next指针,进行链表反转。

代码实例:

class Solution(object):
    def reverseList(self, head):
        if not head or not head.next:
            return head
        new_head = self.reverseList(head.next)
        head.next.next = head
        head.next = None
        return new_head

以上代码中,我们还是定义了一个Solution类,其中reverseList方法的输入参数与方法一相同。当反转到最后一个节点时,我们返回该节点。然后,我们在反向遍历链表的过程中,每次都将当前节点的next指针指向前一个节点。这样反转完成时,我们返回的新的头节点就是原链表的尾节点。

示例:

我们通过一个示例来说明方法一的实现过程:

链表 1 -> 2 -> 3 -> 4 -> 5 -> null

开始时,新链表头节点new_head为null。

第一步:tmp = 2, head.next = null, new_head = 1, head = 2

新链表:2->1->null,原链表:3->4->5->null

第二步:tmp = 3, head.next = 2, new_head = 2, head = 3

新链表:3->2->1->null,原链表:4->5->null

以此类推,直到原链表遍历结束,新链表形成反转链表。

我们再通过一个示例来说明方法二的实现过程:

链表 1 -> 2 -> 3 -> 4 -> 5 -> null

开始时,递归反转链表,传入头节点1。

第一步:第一次递归,传入1->2->3->4->5->null

第二步:第二次递归,传入2->3->4->5->null

第三步:第三次递归,传入3->4->5->null

第四步:第四次递归,传入4->5->null

第五步:第五次递归,传入5->null

第六步:最后一次递归,传入null

回溯的过程中进行链表反转:

null<-5<-4<-3<-2<-1

递归结束后,我们的新链表头节点就为5。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Python实现2种反转链表方法代码实例 - Python技术站

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

相关文章

  • [下载]Android M开发者预览版镜像下载 支持4款Nexus

    下载Android M开发者预览版镜像下载 支持4款Nexus设备 Android M开发者预览版目前只支持以下4款Nexus设备: Nexus 5 Nexus 6 Nexus 9 Nexus Player 下载步骤 以下是下载Android M开发者预览版镜像的详细步骤: 在官方下载页面选择您的设备:https://developer.android.co…

    other 2023年6月26日
    00
  • field.setaccessible()方法

    以下是Field.setAccessible()方法的完整攻略,包括两个示例说明。 1. Field.setAccessible()方法 Field.setAccessible()方法是Java反射API中的一个方法,用于设置字段的可访问性。默认情况下,Java中的字段是私有的,不能从外部访问。使用Field.setAccessible()方法可以绕过这种限…

    other 2023年5月9日
    00
  • Win7桌面右键菜单小工具选项如何删除没有太多作用

    Win7桌面右键菜单小工具选项,是指在windows7系统桌面上右键出现的弹出菜单中,出现的一些小工具选项,例如屏幕保护、背景、个性化等选项。 若想删除Win7桌面右键菜单小工具选项,可以采用以下两种方法: 方法一:修改注册表 按下“Win+R”组合键打开运行窗口,输入“regedit”并回车,打开注册表编辑器。 在注册表编辑器中,依次展开以下目录:HKEY…

    other 2023年6月27日
    00
  • C++中function的实现原理详解

    C++中function的实现原理详解 1. function的概述 function是C++11引入的一个函数对象封装器,它可以像函数指针一样存储和调用可调用对象。function可以存储的可调用对象包括函数、函数指针、成员函数指针和仿函数等,因此它具有很高的灵活性和通用性。 function的定义形式如下: std::function<return…

    other 2023年6月26日
    00
  • Android控件之RatingBar自定义星级评分样式

    Android控件之RatingBar自定义星级评分样式攻略 RatingBar是Android中常用的评分控件,它可以让用户通过点击星星来进行评分。在本攻略中,我们将学习如何自定义RatingBar的样式,以满足特定的设计需求。 步骤一:创建自定义样式 首先,我们需要创建一个自定义的样式来定义RatingBar的外观。在res/values/styles.…

    other 2023年8月26日
    00
  • android 完全退出应用程序实现代码

    下面是详细讲解“android 完全退出应用程序实现代码”的完整攻略。 前言 在安卓开发中,我们经常需要退出应用程序,也就是关闭所有的Activity。但是,默认情况下,系统会将Activity压入栈中,导致我们无法直接回到桌面或者返回到其他应用程序。本教程将介绍几种实现完全退出应用程序的方法。 方法一:使用System.exit() 在Activity的o…

    other 2023年6月25日
    00
  • 电脑如何重装系统 电脑重新安装系统全程图解

    电脑如何重装系统 本文将详细讲解电脑如何重装系统,并提供全程图解和两个示例说明,帮助读者快速掌握这个过程。 准备工作 在重装系统之前,我们需要做好以下准备工作: 备份数据:重装系统会清空电脑中的所有数据,因此在重装系统之前请务必备份好自己的重要数据。 准备安装盘:电脑重装系统需要使用安装盘,可以是光盘或U盘。如果没有安装盘,可以下载Windows官方安装工具…

    other 2023年6月28日
    00
  • mysql 存储过程中变量的定义与赋值操作

    当在MySQL存储过程中定义和使用变量时,可以按照以下步骤进行操作: 定义变量:在存储过程的开头或需要使用变量的地方,使用DECLARE语句来定义变量。语法如下: sql DECLARE variable_name datatype [DEFAULT initial_value]; 其中,variable_name是变量的名称,datatype是变量的数据类…

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