python递归&迭代方法实现链表反转

接下来我将详细讲解如何使用Python的递归和迭代方法实现链表的反转。

什么是链表反转

链表反转(reverse a linked list)指的是将链表中的所有节点的指针方向都倒转,即原来指向下一个节点的指针变为指向前一个节点,这样可以让链表的尾部变为头部,实现链表的逆序。

实现方法

链表反转可以使用递归和迭代两种方法进行实现。

递归方法

递归反转链表的思路是:

  • 递归到链表的最后一个节点;
  • 从最后一个节点开始,将每个节点的下一个节点的指针指向自己;
  • 返回反转后的链表头节点。

用Python代码实现递归反转链表:

# 定义节点结构
class Node:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

# 递归反转链表
def reverseList(head):
    if not head or not head.next:
        return head
    newHead = reverseList(head.next)
    head.next.next = head
    head.next = None
    return newHead

使用以下代码进行测试:

# 构造链表
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node4 = Node(4)
node5 = Node(5)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5

# 打印反转前的链表
p = node1
while p:
    print(p.val, end=" ")
    p = p.next
print()

# 反转链表
newHead = reverseList(node1)

# 打印反转后的链表
p = newHead
while p:
    print(p.val, end=" ")
    p = p.next
print()

输出结果如下:

1 2 3 4 5 
5 4 3 2 1 

迭代方法

迭代反转链表的思路是:

  • 使用三个指针分别指向当前节点、前一个节点和后一个节点;
  • 当前节点指向前一个节点,然后三个指针依次向后移动一个节点;
  • 返回反转后的链表头节点。

用Python代码实现迭代反转链表:

# 迭代反转链表
def reverseList(head):
    if not head or not head.next:
        return head
    pre = None
    cur = head
    nxt = head.next
    while cur:
        cur.next = pre
        pre = cur
        cur = nxt
        nxt = nxt.next if nxt else None
    return pre

使用以下代码进行测试:

# 构造链表
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node4 = Node(4)
node5 = Node(5)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5

# 打印反转前的链表
p = node1
while p:
    print(p.val, end=" ")
    p = p.next
print()

# 反转链表
newHead = reverseList(node1)

# 打印反转后的链表
p = newHead
while p:
    print(p.val, end=" ")
    p = p.next
print()

输出结果如下:

1 2 3 4 5 
5 4 3 2 1 

总结

递归和迭代是两种常见的解决链表反转问题的方法。对于链表较长的情况下,使用迭代方法需要额外的空间来保存三个指针,因此递归方法更节省空间。但是在Python中,递归深度有限制,因此对于较长的链表还是推荐使用迭代方法来实现反转。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python递归&迭代方法实现链表反转 - Python技术站

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

相关文章

  • Win7无法正常运行应用程序怎么解决?

    Win7无法正常运行应用程序怎么解决? 1. 检查应用程序兼容性 一些应用程序是不兼容旧的操作系统或者需要特定的操作系统版本,因此在安装应用程序之前,务必查看应用程序的系统要求,确保应用程序是Windows 7系统兼容的。如果应用程序本身设计就不兼容Windows 7系统,那么无论怎样调整都无法解决无法正常运行的问题。 例如,有些老旧的游戏软件需要Windo…

    other 2023年6月25日
    00
  • 魔兽世界怀旧服暗影之翼要不要优先法系 暗影之翼分配优先级分析

    魔兽世界怀旧服暗影之翼是一款非常受欢迎的游戏,很多玩家都关注关于怀旧服暗影之翼要不要优先法系这个话题。在这里,我们将详细讲解这个话题的完整攻略,包括分析和实例说明,以帮助玩家更好地理解。 魔兽世界怀旧服暗影之翼要不要优先法系 对于这个问题,我们需要深入分析,在暗影之翼中,法系的确非常重要,它可以对敌人进行有效的打击和控制,但是并不意味着其他职业就可以无视。 …

    other 2023年6月27日
    00
  • C++中结构体的类型定义和初始化以及变量引用

    下面是关于C++中结构体的类型定义、初始化和变量引用的详细攻略。 结构体的类型定义 在C++中,结构体是一种用户自定义的数据类型,可以将多个不同类型的变量组合在一起形成一个新的数据类型,一般用于表示复杂的数据结构。 结构体的定义方式为: struct 结构体名称 { 类型1 变量名称1; 类型2 变量名称2; … 类型n 变量名称n; }; 其中,结构体名称…

    other 2023年6月20日
    00
  • 举例解析Java的设计模式编程中里氏替换原则的意义

    举例解析Java的设计模式编程中里氏替换原则的意义 什么是里氏替换原则? 里氏替换原则是面向对象设计原则中的一种,该原则的定义为: 如果一个软件实体使用一个父类的对象,那么它可以替换为一个子类的对象,而不会影响程序的正确性。简单来说,就是将子类对象当成父类对象使用时,程序不会出错。 里氏替换原则的意义 理解里氏替换原则的一个重要意义是能够写出优秀的、可维护的…

    other 2023年6月27日
    00
  • MyBatis 中 SqlMapConfig 配置文件详解

    感谢您对MyBatis的关注和学习。下面是本文介绍MyBatis中SqlMapConfig配置文件的完整攻略。 什么是SqlMapConfig配置文件 SqlMapConfig.xml是MyBatis的主配置文件,它包含了MyBatis的全局配置信息,如数据库连接、事务管理、对象工厂等。MyBatis在启动时会读取该文件,并根据其中的配置进行相应的操作。 S…

    other 2023年6月25日
    00
  • sourcetree生成秘钥公钥

    以下是“Sourcetree生成秘钥公钥”的完整攻略: Sourcetree生成秘钥公钥 Sourcetree是一款免费的Git和Mercurial客户端,支持Windows和macOS平台。在使用Sourcetree时,您可能需要生成秘钥公钥,以便在Git服务器上进行身份验证。本攻略将介绍如何在Sourcetree生成秘钥公钥。 步骤1:安装Sourcet…

    other 2023年5月7日
    00
  • python 内置错误类型 Built-in Exceptions

    Python内置了许多异常类型,这些异常类型可以帮助我们更好地处理程序中的错误。本文将详细讲解Python内置错误类型,包括常见的异常类型、异常类型的继承关系和使用方法,并提供两个示例说明。 常见的异常类型 以下是Python中常见的异常类型: Exception:所有异常的基类。 ArithmeticError:所有数学错误的基类。 AssertionEr…

    other 2023年5月5日
    00
  • java判断class子类或父类的实例方法

    要判断Java中的一个实例方法属于其父类还是子类,可以通过利用Java反射API中的getDeclaredMethod()方法实现。 首先,在Java中,一个对象的所属类可以通过instanceof关键字来判断。但是,如果需要定位该实例方法是被哪个类所声明的,就需要使用Java反射API了。要使用Java反射API获取方法,需要使用Class类的 getDe…

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