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

力扣Hot100--206.反转链表

力扣Hot100–206.反转链表

要求:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

解题思路:
1、使用列表存储节点后重新连接的方式实现了链表反转
缺点:空间复杂度为 O(n)​​,因为需要额外的列表来存储所有节点的引用

比较常见的解法就是迭代法和递归法
迭代:
时间复杂度:O(n),其中 n 是链表的长度。空间复杂度:O(1)。
递归:
时间复杂度:O(n),其中 n 是链表的长度。空间复杂度:O(n),其中 n 是链表的长度。
本方法:时间复杂度:O(n),其中 n 是链表的长度。空间复杂度:O(n),其中 n 是链表的长度。

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:if head is None:return Nonemode_set =[]current = headwhile current:mode_set.append(current)current = current.nextn = len(mode_set)for i in range(n-1,0,-1):mode_set[i].next = mode_set[i-1]mode_set[0].next = Nonereturn mode_set[-1]

迭代法:

class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:prev = None curr = headwhile curr:next_node=curr.nextcurr.next = prevprev = currcurr = next_nodereturn prev

前两次的循环过程:
初始状态:​​
链表: 1 → 2 → 3 → 4 → 5 → None
prev = None
curr = 1(指向头节点)

第一次循环:
​步骤 1: next_node = curr.next​​
保存 curr(节点1) 的下一个节点 (节点2),防止断链。

prev = None
curr = 12345 → None
next_node = 2345 → None

​​步骤 2: curr.next = prev​​
反转指针,让 curr(节点1) 的 next指向 prev(None)。至此,节点1成为了新链表的尾部。
(链表暂时被切断为两部分)

prev = None
curr = 1 → None
next_node = 2345 → None

​​步骤 3: prev = curr​​
将 prev指针移动到当前已反转部分的头节点,即节点1。

prev = 1 → None
curr = 1 → None
next_node = 2345 → None

​​步骤 4: curr = next_node​​
将 curr指针移动到之前保存的下一个节点,即节点2,准备处理下一个节点。

prev = 1 → None
curr = 2345 → None
next_node = 2345 → None

第二次循环:
步骤 1: next_node = curr.next​​
保存 curr(节点2) 的下一个节点 (节点3)。

prev = 1 → None
curr = 2345 → None
next_node = 345 → None

​​步骤 2: curr.next = prev​​
反转指针,让 curr(节点2) 的 next指向 prev(节点1)。现在节点2连接到了节点1的前面。
(已反转部分变为 2→1→None)

prev = 1 → None
curr = 21 → None
next_node = 345 → None

​​步骤 3: prev = curr​​
将 prev指针移动到当前已反转部分的新头节点,即节点2。

prev = 21 → None
curr = 21 → None
next_node = 345 → None

​​步骤 4: curr = next_node​​
将 curr指针移动到之前保存的下一个节点,即节点3,准备处理下一个节点。

prev = 21 → None
curr = 345 → None
next_node = 345 → None

递归法:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:if(head is None or head.next is None):return headnewhead = self.reverseList(head.next)head.next.next = headhead.next = Nonereturn newhead

阶段一:递
​​第一次调用​​: reverseList(节点1)

不满足终止条件(节点1.next是 节点2, 不为空)。
执行 new_head = self.reverseList(节点2),​​等待递归结果​​。

​​第二次调用​​: reverseList(节点2)

不满足终止条件(节点2.next是 节点3, 不为空)。
执行 new_head = self.reverseList(节点3),​​等待递归结果​​。

​​第三次调用​​: reverseList(节点3)

​​满足终止条件​​!因为 节点3.next是 None。
函数返回 节点3(head=节点3)。​​这是递归的转折点​​。
reverseList(节点3)的返回值 节点3将成为新链表的头节点 (new_head),并开始逐层回溯。

阶段二:归
递归调用栈开始逐层返回结果并执行后续调整指针的代码。这是反转发生的地方。

​​返回到第二次调用​​ 的地方(reverseList(节点2)的上下文)

new_head拿到了从第三次调用返回的 节点3 (new_head= 节点3)。
开始执行后续代码:
head.next.next = head;-> 此时 head是 节点2,head.next是 节点3。让 ​​节点3的next​​ 指向 ​​节点2​​。 (3 -> 2)
head.next = None;-> 让 ​​节点2的next​​ 指向 None。
最后,返回 new_head(节点3)

此时链表状态: (节点3) -> (节点2) -> None,节点1还未被处理,仍指向 节点2。

​​返回到第一次调用​​ (reverseList(节点1)的上下文)

new_head拿到了从第二次调用返回的 节点3。
开始执行后续代码:
head.next.next = head;-> 此时 head是 节点1,head.next是 节点2。让 ​​节点2的next​​ 指向 ​​节点1​​,修改上次结果((节点2) -> None)。 (2 -> 1)
head.next = None;-> 让 ​​节点1的next​​ 指向 None,使其成为新链表的尾节点。
最后,返回 new_head(节点3)

此时链表状态: (节点3) -> (节点2) -> (节点1) -> None。
​​最终结果​​: 链表成功反转为 3 -> 2 -> 1 -> None。函数返回的新头节点是 节点3。

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

相关文章:

  • Java 生态监控体系实战:Prometheus+Grafana+SkyWalking 整合全指南(三)
  • 生活琐记(3)
  • 在 Elasticsearch 和 GCP 上的混合搜索和语义重排序
  • 借助Aspose.HTML控件,使用 Python 将 HTML 转换为 DOCX
  • 设计测试用例的万能公式
  • 黑马头条_SpringCloud项目阶段三:HTML文件生成以及素材文章CRUD
  • 精准模拟,实战赋能-比亚迪秦EV整车检测与诊断仿真实训系统
  • 学习路之PHP--生成测试数据:fakerphp的使用
  • 《UE5_C++多人TPS完整教程》学习笔记54 ——《P55 旋转根骨骼(Rotate Root Bone)》
  • go资深之路笔记(五)用系统信号实现优雅关机
  • C++实战㉔】解锁C++ STL魔法:list与deque实战秘籍
  • Linux 系统指令——助力信奥初赛
  • LVS详解:构建高性能Linux负载均衡集群
  • 【Linux网络编程】网络层协议-----IP协议
  • 电池AH的定义与WH关系
  • 谙流 ASK 技术解析(四):负载均衡引擎
  • 乾元通渠道商中标国家华中区域应急救援中心应急救援装备采购项目
  • 网络原理补充——NAT/NAPT、代理服务、内网穿透、交换机
  • 深入 HTTP 协议:剖析 1688 商品详情 API 的请求构造与签名机制
  • 共用体union和大小端模式
  • 2022年下半年 系统架构设计师 案例分析
  • LeetCode 面试经典 150_哈希表_有效的字母异位词(42_242_C++_简单)
  • go webrtc - 3 工程演示
  • JVM(五)-- 执行引擎
  • 微算法科技(NASDAQ:MLGO)量子架构搜索技术:突破变分量子算法性能瓶颈,实现量子计算的鲁棒优化
  • 海亮科技亮相第十一届亚教展,“教育 + AI”赋能县域教育振兴
  • JMeter的配置元件
  • Charles与Postman、JMeter结合使用教程:高效接口调试与性能测试方案
  • 【Haddop】Hive的离线分析与Sqoop的数据集成
  • 嵌入式 Linux 基础入门笔记(1)