3分钟搞定反转链表!动画演示迭代与递归两种方法,看完秒懂

3分钟搞定反转链表!动画演示迭代与递归两种方法,看完秒懂

【免费下载链接】algorithm-base 一位酷爱做饭的程序员,立志用动画将算法说的通俗易懂。我的面试网站 www.chengxuchu.com 【免费下载链接】algorithm-base 项目地址: https://gitcode.com/gh_mirrors/al/algorithm-base

你还在为反转链表面试题发愁?是否每次遇到递归解法都像在看天书?本文用动画演示+手把手代码注释,带你彻底搞懂链表反转的迭代与递归两种实现,从此算法面试不再慌!

读完本文你将掌握:

  • 迭代法反转链表的三指针技巧(附动图演示)
  • 递归解法的"从后往前"思考模式
  • 6种编程语言的实现代码(Java/C++/Python/JS/Go/Swift)
  • 常见面试变形题的解题思路

为什么反转链表如此重要?

反转链表(Reverse Linked List)是算法面试中的"常青树",在LeetCode上标记为简单题,但却是字节跳动、阿里等大厂面试的高频考题。这道题看似简单,却能有效考察候选人的指针操作能力和递归思维。

项目中完整教程:animation-simulation/链表篇/leetcode206反转链表.md

迭代法:三指针翻转魔法

迭代法是反转链表最直观的实现方式,核心思想是通过三个指针的配合,逐个改变节点的指向。

动画演示过程

下面的动画展示了1→2→3→4→5→NULL反转成5→4→3→2→1→NULL的全过程:

反转链表迭代法动画

步骤分解

  1. 初始化指针

    • low指针指向NULL(反转后的链表尾部)
    • pro指针指向head(原链表头部)
  2. 循环反转

    • temp临时保存pro的位置
    • pro指针后移一位(pro = pro.next)
    • temp指向low(完成当前节点反转)
    • low指针后移一位(low = temp)
  3. 终止条件:当pro指针为NULL时,low指针就是新的头节点

代码实现(Python版)

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        # 特殊情况处理:空链表或只有一个节点
        if head is None or head.next is None:
            return head
            
        low = None  # 黄色指针:指向已反转部分的头节点
        pro = head  # 绿色指针:指向待反转部分的头节点
        
        while pro is not None:
            temp = pro  # 橙色指针:临时保存当前节点
            pro = pro.next  # 移动绿色指针到下一个节点
            temp.next = low  # 反转当前节点的指向
            low = temp  # 移动黄色指针到当前节点
            
        return low  # 循环结束后,low成为新的头节点

六种语言完整实现:animation-simulation/链表篇/leetcode206反转链表.md

递归法:从后往前的优雅

递归解法代码更简洁,但理解起来更抽象。核心思路是"先递后归",先走到链表尾部,再从后往前逐个反转节点指向。

递归思路图解

原链表:1 → 2 → 3 → 4 → 5 → NULL

递归过程:
reverseList(1)
└── reverseList(2)
    └── reverseList(3)
        └── reverseList(4)
            └── reverseList(5)  # 返回5(基准情况)
            └── 5.next = 4      # 反转5→4
        └── 4.next = 3          # 反转4→3
    └── 3.next = 2              # 反转3→2
└── 2.next = 1                  # 反转2→1
1.next = NULL                   # 防止循环
返回5(新的头节点)

代码实现(Java版)

class Solution {
    public ListNode reverseList(ListNode head) {
        // 基准条件:到达链表尾部或空链表
        if (head == null || head.next == null) {
            return head;
        }
        
        // 递归处理剩余节点,pro指向最后一个节点
        ListNode pro = reverseList(head.next);
        
        // 反转当前节点与下一个节点的指向
        head.next.next = head;  // 相当于 4.next.next = 4(让5指向4)
        head.next = null;       // 防止形成环
        
        return pro;  // 返回新的头节点
    }
}

递归技巧总结

  1. 找基准情况:当head.next为null时,说明到达最后一个节点,直接返回
  2. 递归处理子问题:reverseList(head.next)得到子链表的反转结果
  3. 反转当前节点:head.next.next = head(关键一步)
  4. 防止环形成:head.next = null

两种方法对比与选择

方法时间复杂度空间复杂度特点
迭代法O(n)O(1)直观易懂,指针操作,无栈开销
递归法O(n)O(n)代码简洁,递归调用栈占用额外空间

面试建议:优先掌握迭代法,空间复杂度更优;递归法则能体现算法思维,可作为加分项。

常见面试变形题

掌握了基础反转后,这些变形题也能迎刃而解:

  1. 反转链表前N个节点:只需在迭代到第N个节点时停止
  2. 反转链表的一部分:找到反转起始点,按基础方法反转后重新连接
  3. K个一组反转链表:LeetCode 25题,结合迭代和递归的综合应用

项目资源与学习建议

算法学习需要动手实践,推荐结合项目中的动画演示和代码注释进行练习:

建议先自己尝试写代码,再对照教程中的动画和注释检查。遇到问题可以在项目仓库提交issue,或加入作者的学习交流群(详见项目README)。

总结

反转链表作为算法面试的基础题,掌握其两种实现方法至关重要。迭代法通过三指针配合,逐个反转节点;递归法则利用"从后往前"的思路,代码更简洁但需要理解递归调用栈。

建议初学者先掌握迭代法,熟悉指针操作后再挑战递归解法。项目中的动画演示是理解这两种方法的最佳工具,配合多语言代码实现,能帮助你彻底攻克这一经典算法题。

点赞收藏本文,下次面试前复习一遍,算法通过率提升50%!下期我们将讲解"环形链表"的检测与处理,敬请关注。

【免费下载链接】algorithm-base 一位酷爱做饭的程序员,立志用动画将算法说的通俗易懂。我的面试网站 www.chengxuchu.com 【免费下载链接】algorithm-base 项目地址: https://gitcode.com/gh_mirrors/al/algorithm-base

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值