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

当我们需要对链表进行反转的时候,在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 Navigation重建Fragment问题分析及解决

    我来详细讲解一下“Android Navigation重建Fragment问题分析及解决”的完整攻略。 什么是Navigation重建Fragment问题? 在使用Android Navigation组件时,如果使用了NavigationUI.setupWithNavController()来设置BottomNavigationView或者使用了AppBar…

    other 2023年6月27日
    00
  • js中var、let、const之间的区别

    JavaScript中var、let、const之间的区别 在JavaScript中,var、let和const是用于声明变量的关键字。它们之间有一些重要的区别,包括作用域、变量提升和可变性等方面。 var var是ES5中引入的关键字,用于声明变量。它具有以下特点: 函数作用域:var声明的变量的作用域是函数级别的,即在函数内部声明的变量在函数外部是不可访…

    other 2023年8月21日
    00
  • 解析Linux下C++编译和链接

    我们来详细讲解一下如何在Linux下进行C++编译和链接。 首先我们需要编写一个C++源文件,例如下面这个示例: #include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; return 0;…

    other 2023年6月26日
    00
  • Java处理表格的实用工具库

    Java处理表格的实用工具库 在Java开发中,有许多实用的工具库可用于处理表格数据。以下是使用两个常用的Java表格处理工具库的详细攻略: Apache POI Apache POI是一个流行的Java库,用于读取、写入和操作Microsoft Office格式的文件,包括Excel表格。以下是使用Apache POI处理表格的示例说明: 首先,确保已经添…

    other 2023年10月15日
    00
  • Linux中使用init命令关机、重启、切换模式等

    在Linux系统中,init命令是系统启动过程中第一个被启动的进程,它的主要作用是启动和停止系统上其他进程。在init的控制下,系统可以管理进程、初始化系统环境、启动目标运行级别和关闭系统等。 下面我们来详细讲解一下在Linux中使用init命令关机、重启、切换模式等的完整攻略。 1. 关机 在Linux中,正常的关机命令是shutdown。但是shutdo…

    other 2023年6月27日
    00
  • 关于Python作用域自学总结

    关于Python作用域自学总结攻略 什么是作用域? 在Python中,作用域是指变量的可访问性和可见性的范围。Python中有三种作用域:全局作用域、局部作用域和内建作用域。 全局作用域:在整个程序中都可访问的变量,定义在函数外部。 局部作用域:只在函数内部可访问的变量,定义在函数内部。 内建作用域:Python内置的函数和变量,如print()和len()…

    other 2023年8月19日
    00
  • 使用单例模式来打造activitymanager类

    使用单例模式来打造ActivityManager类 在Android应用程序中,管理Activity是一个很重要的问题,可以使用一个单例模式实现Activity的管理。 单例模式概述 单例模式是一种常用的设计模式,它可以确保一个类只有一个实例,提供对这个实例特定访问点。在Java中,实现单例模式一般有两种方式: 饿汉式:在程序启动时即实例化,线程安全,但不考…

    其他 2023年3月28日
    00
  • 机械师T90值得买吗?机械师T90悍狼游戏本深度评测+拆解

    很抱歉,作为文本模型,我无法以标准的markdown格式回答您的问题。但是,我可以为您提供一份详细的攻略,包含机械师T90悍狼游戏本的深度评测和拆解,并提供两个示例说明。 机械师T90悍狼游戏本深度评测+拆解 1. 外观设计 机械师T90悍狼游戏本采用了坚固耐用的金属外壳,具有独特的工业风格设计。其黑色外观和红色背光键盘给人一种高端大气的感觉。 2. 性能表…

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