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
【Leetcode刷题Python】328. 奇偶链表
在不使用额外空间的情况下,将链表中的奇数和偶数索引节点重新排序的方法,并提供了相应的Python实现代码。
30 0
|
2月前
|
Python
【Leetcode刷题Python】25.K 个一组翻转链表
解决LeetCode "K 个一组翻转链表" 问题的三种方法:使用栈、尾插法和虚拟节点顺序法,并提供了每种方法的Python实现代码。
27 0
|
2月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
23 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
2月前
|
算法 Python
python函数递归和生成器
python函数递归和生成器
|
2月前
|
算法 数据挖掘 Python
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
42 5
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
33 4
|
2月前
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
2月前
|
存储 Python
【Leetcode刷题Python】23. 合并K个升序链表
合并K个升序链表的方法:使用数组排序的暴力求解法、使用小顶堆的高效方法,以及分而治之的策略,并提供了相应的Python实现代码。
16 1
|
2月前
|
Python
【Leetcode刷题Python】138. 复制带随机指针的链表
LeetCode上题目“138. 复制带随机指针的链表”的Python解决方案,包括两种方法:一种是在每个节点后复制一个新节点然后再分离出来形成新链表;另一种是构建一个字典来跟踪原始节点与其副本之间的映射关系,从而处理新链表的构建。
15 1
下一篇
无影云桌面