Python OJ题典型:链表反转的迭代和递归

简介: 本文介绍了如何使用迭代和递归两种方法来实现链表的反转。通过详细的解题思路和代码实现,帮助读者理解链表反转的原理和实现方式。

算法介绍

本文将介绍如何反转链表,即将原链表的头节点变为新链表的尾节点。我们将通过迭代和递归两种方式实现链表的反转。

算法解析

给定一个链表,我们需要实现一个函数来反转这个链表,并返回反转后的链表头节点。

解题思路

1. 迭代法

迭代法是最常见的解决链表反转的方法。我们可以使用三个指针,分别指向前一个节点、当前节点和下一个节点。通过不断更新指针的指向,将链表中的节点一个个反转。

具体步骤如下:

  1. 初始化指针 prevNone,指针 curr 为链表的头节点。
  2. 循环遍历链表,直到当前节点 curr 为空。
    1. 将当前节点的下一个节点保存为临时变量 next
    2. 将当前节点的 next 指向前一个节点 prev
    3. 更新指针 prev 为当前节点 curr
    4. 更新指针 curr 为临时变量 next
  3. 循环结束后,返回更新后的链表头节点 prev

2. 递归法

递归法是另一种实现链表反转的方法。递归的思想是将大问题分解为小问题的求解,直到达到基本情况。

具体步骤如下:

  1. 定义递归函数 reverseList,接收一个链表节点作为参数。
  2. 当前节点为空或者下一个节点为空时,直接返回当前节点。
  3. 递归调用 reverseList 函数,传入下一个节点,并将返回结果保存为变量 newHead
  4. 将下一个节点的 next 指向当前节点。
  5. 将当前节点的 next 设为 None
  6. 返回 newHead

代码实现

# 定义链表节点类
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverseListIteratively(head):
    prev = None
    curr = head

    while curr:
        next_node = curr.next
        curr.next = prev
        prev = curr
        curr = next_node

    return prev

def reverseListRecursively(head):
    if not head or not head.next:
        return head

    new_head = reverseListRecursively(head.next)
    head.next.next = head
    head.next = None

    return new_head

# 测试示例
# 创建链表 1->2->3->4->5
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)

# 迭代法反转链表
iterative_result = reverseListIteratively(head)

# 递归法反转链表
recursive_result = reverseListRecursively(head)

解题技巧

  • 迭代法适用于链表反转问题,使用三个指针进行节点更新。
  • 递归法通过不断调用函数自身来解决链表反转问题,需要注意停止条件和指针的更新。

总结

本文介绍了两种方法来实现链表的反转:迭代法和递归法。迭代法通过使用三个指针来反转链表中的节点,而递归法则是通过不断调用函数自身来实现链表的反转。根据实际情况选择合适的方法来解决链表反转问题。

目录
相关文章
|
2月前
|
开发者 Python 容器
深入理解Python迭代器:迭代机制的核心与应用
本文介绍了Python迭代器的核心概念、工作原理和应用场景。迭代器是遍历容器类型数据结构(如列表、元组、字典和集合)的对象,遵循迭代器协议,具有记忆遍历位置和一次性特点。通过实现迭代器协议,开发者能为自定义类型定义迭代行为,实现高效处理大量数据和与其他迭代工具协同工作。迭代器与可迭代对象的区别在于,可迭代对象实现`__iter__()`方法,返回迭代器,而迭代器实现`__next__()`方法,用于逐个访问元素。理解并运用迭代器能提升Python代码的性能和可读性。
|
2月前
|
Python
请解释Python中的递归是什么?并举例说明其用法。
【2月更文挑战第25天】【2月更文挑战第85篇】请解释Python中的递归是什么?并举例说明其用法。
|
1月前
|
Python
【python】爬楼梯—递归分析(超级详细)
【python】爬楼梯—递归分析(超级详细)
C4.
|
2月前
|
算法 搜索推荐 编译器
Python递归
Python递归
C4.
12 1
|
20天前
|
算法
算法系列--递归(一)--与链表有关(上)
算法系列--递归(一)--与链表有关
28 0
|
16天前
|
机器学习/深度学习 存储 测试技术
使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测
使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测
23 0
|
17天前
|
缓存 算法 Python
python算法对音频信号处理Sonification :Gauss-Seidel迭代算法
python算法对音频信号处理Sonification :Gauss-Seidel迭代算法
10 0
|
2月前
|
算法 索引
LeetCode刷题--- 138. 复制带随机指针的链表(哈希表+迭代)
LeetCode刷题--- 138. 复制带随机指针的链表(哈希表+迭代)
|
2月前
|
Python
Python中使用for循环列表或可迭代对象
Python中使用for循环列表或可迭代对象
16 0
|
2月前
|
索引 Python
在 Python 中迭代地遍历两个列表
在 Python 中迭代地遍历两个列表
18 0