LeetCode 热题 100 206. 反转链表

打印 上一主题 下一主题

主题 877|帖子 877|积分 2631

LeetCode 热题 100 | 206. 反转链表

大家好,今天我们来办理一道经典的算法题——反转链表。这道题在 LeetCode 上被标记为简单难度,要求我们将一个单链表反转,并返回反转后的链表。下面我将详细讲解解题思路,并附上 Python 代码实现。

题目描述

给定单链表的头节点 head,反转链表,并返回反转后的链表。
示例:
  1. 输入:head = [1,2,3,4,5]
  2. 输出:[5,4,3,2,1]
复制代码

解题思路

反转链表的核心头脑是改变链表中节点的指向关系,将每个节点的 next 指针指向前一个节点。我们可以通过 迭代递归 两种方法来实现。

方法 1:迭代法

核心头脑



  • 利用三个指针:

    • prev:指向当前节点的前一个节点,初始为 None

    • curr:指向当前节点,初始为 head。
    • next:指向当前节点的下一个节点。

  • 遍历链表,逐个反转节点的指向。
步调


  • 初始化 prev = None
    ,curr = head。
  • 遍历链表:

    • 保存 curr 的下一个节点:next = curr.next。
    • 反转当前节点的指向:curr.next = prev。
    • 移动 prev 和 curr:prev = curr,curr = next。

  • 遍历竣事后,prev 就是反转后的链表的头节点。
代码实现

  1. class ListNode:
  2.     def __init__(self, val=0, next=None
  3. ):
  4.         self.val = val
  5.         self.next = next
  6. def reverseList(head):
  7.     prev = None
  8.   # 前一个节点
  9.     curr = head  # 当前节点
  10.    
  11.     while curr:
  12.         next = curr.next  # 保存下一个节点
  13.         curr.next = prev  # 反转当前节点的指向
  14.         prev = curr  # 移动 prev
  15.         curr = next  # 移动 curr
  16.    
  17.     return prev  # 返回反转后的头节点
复制代码
复杂度分析



  • 时间复杂度:O(n),其中 n 是链表的长度。须要遍历链表一次。
  • 空间复杂度:O(1),只利用了常数个额外空间。

方法 2:递归法

核心头脑



  • 递归地反转链表:

    • 递归到链表的最后一个节点,将其作为新的头节点。
    • 在回溯过程中,逐个反转节点的指向。

步调


  • 递归停止条件:如果链表为空或只有一个节点,直接返回 head。
  • 递归调用:反转 head.next 之后的链表。
  • 反转当前节点的指向:head.next.next = head。
  • 断开当前节点的指向:head.next = None

  • 返回新的头节点。
代码实现

  1. class ListNode:
  2.     def __init__(self, val=0, next=None
  3. ):
  4.         self.val = val
  5.         self.next = next
  6. def reverseList(head):
  7.     # 递归终止条件
  8.     if not head or not head.next:
  9.         return head
  10.    
  11.     # 递归反转剩余链表
  12.     new_head = reverseList(head.next)
  13.    
  14.     # 反转当前节点的指向
  15.     head.next.next = head
  16.     head.next = None
  17.    
  18.     # 返回新的头节点
  19.     return new_head
复制代码
复杂度分析



  • 时间复杂度:O(n),其中 n 是链表的长度。须要递归调用 n 次。
  • 空间复杂度:O(n),递归调用栈的深度为 n。

示例运行

示例 1

  1. # 创建链表 1 -> 2 -> 3 -> 4 -> 5
  2. head = ListNode(1)
  3. head.next = ListNode(2)
  4. head.next.next = ListNode(3)
  5. head.next.next.next = ListNode(4)
  6. head.next.next.next.next = ListNode(5)
  7. # 反转链表
  8. reversed_head = reverseList(head)
  9. # 输出反转后的链表
  10. while reversed_head:
  11.     print(reversed_head.val, end=" -> ")
  12.     reversed_head = reversed_head.next
  13. print("None
  14. ")
复制代码
输出:
  1. 5 -> 4 -> 3 -> 2 -> 1 -> None
复制代码
示例 2

  1. # 创建链表 1 -> 2
  2. head = ListNode(1)
  3. head.next = ListNode(2)
  4. # 反转链表
  5. reversed_head = reverseList(head)
  6. # 输出反转后的链表
  7. while reversed_head:
  8.     print(reversed_head.val, end=" -> ")
  9.     reversed_head = reversed_head.next
  10. print("None
  11. ")
复制代码
输出:
  1. 2 -> 1 -> None
复制代码
示例 3

  1. # 创建空链表
  2. head = None
  3. # 反转链表
  4. reversed_head = reverseList(head)
  5. # 输出反转后的链表
  6. while reversed_head:
  7.     print(reversed_head.val, end=" -> ")
  8.     reversed_head = reversed_head.next
  9. print("None
  10. ")
复制代码
输出:
  1. None
复制代码

总结



  • 迭代法:通过遍历链表,逐个反转节点的指向,时间复杂度为 O(n),空间复杂度为 O(1)。
  • 递归法:通过递归调用反转链表,时间复杂度为 O(n),空间复杂度为 O(n)。
  • 两种方法都能高效地办理反转链表的问题,选择哪种方法取决于具体需求和场景。
希望这篇题解对你有帮助!如果另有其他问题,欢迎继承提问!
关注我,获取更多算法题解和编程技巧!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表