当前位置: 首页 > news >正文

衡水城乡建设局网站首页北京网站建设华大

衡水城乡建设局网站首页,北京网站建设华大,郑州承接各类网站建设,杭州市建设网官网LeetCode 热题 100 | 206. 反转链表 大家好,今天我们来解决一道经典的算法题——反转链表。这道题在 LeetCode 上被标记为简单难度,要求我们将一个单链表反转,并返回反转后的链表。下面我将详细讲解解题思路,并附上 Python 代码实…

LeetCode 热题 100 | 206. 反转链表

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


题目描述

给定单链表的头节点 head,反转链表,并返回反转后的链表。

示例:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

解题思路

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


方法 1:迭代法

核心思想
  • 使用三个指针:
    • prev:指向当前节点的前一个节点,初始为 None
    • curr:指向当前节点,初始为 head
    • next:指向当前节点的下一个节点。
  • 遍历链表,逐个反转节点的指向。
步骤
  1. 初始化 prev = Nonecurr = head
  2. 遍历链表:
    • 保存 curr 的下一个节点:next = curr.next
    • 反转当前节点的指向:curr.next = prev
    • 移动 prevcurrprev = currcurr = next
  3. 遍历结束后,prev 就是反转后的链表的头节点。
代码实现
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef reverseList(head):prev = None  # 前一个节点curr = head  # 当前节点while curr:next = curr.next  # 保存下一个节点curr.next = prev  # 反转当前节点的指向prev = curr  # 移动 prevcurr = next  # 移动 currreturn prev  # 返回反转后的头节点
复杂度分析
  • 时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次。
  • 空间复杂度:O(1),只使用了常数个额外空间。

方法 2:递归法

核心思想
  • 递归地反转链表:
    • 递归到链表的最后一个节点,将其作为新的头节点。
    • 在回溯过程中,逐个反转节点的指向。
步骤
  1. 递归终止条件:如果链表为空或只有一个节点,直接返回 head
  2. 递归调用:反转 head.next 之后的链表。
  3. 反转当前节点的指向:head.next.next = head
  4. 断开当前节点的指向:head.next = None
  5. 返回新的头节点。
代码实现
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef reverseList(head):# 递归终止条件if not head or not head.next:return head# 递归反转剩余链表new_head = reverseList(head.next)# 反转当前节点的指向head.next.next = headhead.next = None# 返回新的头节点return new_head
复杂度分析
  • 时间复杂度:O(n),其中 n 是链表的长度。需要递归调用 n 次。
  • 空间复杂度:O(n),递归调用栈的深度为 n。

示例运行

示例 1
# 创建链表 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)# 反转链表
reversed_head = reverseList(head)# 输出反转后的链表
while reversed_head:print(reversed_head.val, end=" -> ")reversed_head = reversed_head.next
print("None")

输出:

5 -> 4 -> 3 -> 2 -> 1 -> None
示例 2
# 创建链表 1 -> 2
head = ListNode(1)
head.next = ListNode(2)# 反转链表
reversed_head = reverseList(head)# 输出反转后的链表
while reversed_head:print(reversed_head.val, end=" -> ")reversed_head = reversed_head.next
print("None")

输出:

2 -> 1 -> None
示例 3
# 创建空链表
head = None# 反转链表
reversed_head = reverseList(head)# 输出反转后的链表
while reversed_head:print(reversed_head.val, end=" -> ")reversed_head = reversed_head.next
print("None")

输出:

None

总结

  • 迭代法:通过遍历链表,逐个反转节点的指向,时间复杂度为 O(n),空间复杂度为 O(1)。
  • 递归法:通过递归调用反转链表,时间复杂度为 O(n),空间复杂度为 O(n)。
  • 两种方法都能高效地解决反转链表的问题,选择哪种方法取决于具体需求和场景。

希望这篇题解对你有帮助!如果还有其他问题,欢迎继续提问!

关注我,获取更多算法题解和编程技巧!

http://www.dtcms.com/a/519335.html

相关文章:

  • 湛江网站建设哪家优惠多常见的网站结构有哪些
  • php网站源码架构seo标题生成器
  • ui设计师与网站编辑有什么关系重庆森林为什么不能看
  • 站长工具成品源码广西贵港建设集团有限公司网站
  • 电子商务网站建设技术解决方案wordpress ios
  • 企业是如何做电子商务网站软件开发培训机构去学
  • 摄影网站策划书wordpress 赞 分享
  • 深圳我的网站深圳市工程交易服务网宝安
  • php制作wap网站开发我国酒店网站建设存在的问题
  • 金坛网站建设企业手机网站建设渠道
  • 做网站要不要钱东莞网站快速优化排名
  • 做微信营销网站建设dw个人简历网页制作
  • 建个免费的销售网站好asp net4.0网站开发
  • 给个能看的网站中国500强企业名称
  • 网站一般用什么免费字体云主机wordpress
  • 旅游网站流程图电子商务网站开发的视频
  • 网站集约化建设流程专业网站建设价位
  • 食品网站建设客户需求调查表网站硬件费用
  • 深圳做网站600百度官网首页网址
  • 购物网站前端浮动特效怎么做西宁大型网站建设
  • 电脑网站制作教程网站空间商是什么意思
  • 网站开发范围游戏模板 wordpress
  • 企业网站 免费 php商标logo创意免费一键生成
  • 河南省建设监理协会官方网站大学英语精品课程网站建设
  • php公司网站什么是企业营销型网站?
  • 做音乐网站曲库在哪找带动画引导的网站
  • 加强政协机关网站建设辽宁省建设局网站
  • 广州微信网站开发公司内网网站建设主流语言
  • 互联网站备案信息查询tp3企业网站开发百度云
  • 国外网站建设什么价格赤峰建设银行网站