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

力扣刷题(第四十九天)

灵感来源 

- 保持更新,努力学习

- python脚本学习

反转链表

解题思路

  1. 迭代法:通过遍历链表,逐个改变节点的指针方向。具体步骤如下:

    • 使用三个指针:prev(初始为None)、curr(初始为头节点)、next_node(用于保存当前节点的下一个节点)。
    • 在遍历过程中,先保存当前节点的下一个节点,然后将当前节点的指针指向前一个节点,最后更新prevcurr指针。
    • 重复上述步骤,直到遍历完整个链表,此时prev指针即为新的头节点。
  2. 递归法:通过递归调用反转后续节点,然后调整当前节点的指针方向。具体步骤如下:

    • 递归反转当前节点的后续链表。
    • 将当前节点的下一个节点的指针指向当前节点。
    • 将当前节点的指针置为None,避免形成环。
      # Definition for singly-linked list.
      class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass Solution:# 迭代方法def reverseList(self, head: ListNode) -> ListNode:prev = Nonecurr = headwhile curr:next_node = curr.next  # 保存下一个节点curr.next = prev       # 反转指针prev = curr            # 移动prev指针curr = next_node       # 移动curr指针return prev                # 返回新的头节点# 递归方法def reverseListRecursive(self, head: ListNode) -> ListNode:if not head or not head.next:return head# 递归反转后续节点new_head = self.reverseListRecursive(head.next)# 调整指针方向head.next.next = headhead.next = Nonereturn new_head# 辅助函数:将列表转换为链表
      def list_to_linkedlist(lst):dummy = ListNode(0)current = dummyfor val in lst:current.next = ListNode(val)current = current.nextreturn dummy.next# 辅助函数:将链表转换为列表
      def linkedlist_to_list(head):result = []current = headwhile current:result.append(current.val)current = current.nextreturn result# 示例用法
      if __name__ == "__main__":# 创建链表 1->2->3->4->5head = list_to_linkedlist([1, 2, 3, 4, 5])# 使用迭代方法反转链表solution = Solution()reversed_head = solution.reverseList(head)print("迭代方法反转后的链表:", linkedlist_to_list(reversed_head))# 重新创建链表 1->2->3->4->5head = list_to_linkedlist([1, 2, 3, 4, 5])# 使用递归方法反转链表reversed_head_recursive = solution.reverseListRecursive(head)print("递归方法反转后的链表:", linkedlist_to_list(reversed_head_recursive))    

逐行解释

# 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: ListNode) -> ListNode:prev = None           # 初始化前一个节点为Nonecurr = head           # 初始化当前节点为头节点while curr:           # 遍历链表直到当前节点为空next_node = curr.next  # 保存当前节点的下一个节点curr.next = prev       # 将当前节点的指针指向前一个节点prev = curr            # 前一个节点向后移动curr = next_node       # 当前节点向后移动return prev                # 返回新的头节点(原链表的尾节点)# 递归方法:通过递归反转后续节点,再调整当前节点的指针def reverseListRecursive(self, head: ListNode) -> ListNode:if not head or not head.next:  # 递归终止条件:节点为空或为尾节点return head# 递归反转后续节点,返回新的头节点new_head = self.reverseListRecursive(head.next)# 调整指针方向:将当前节点的下一个节点的next指向当前节点head.next.next = head# 断开当前节点的next指针,防止形成环head.next = Nonereturn new_head                # 返回新的头节点# 辅助函数:将列表转换为链表
def list_to_linkedlist(lst):dummy = ListNode(0)  # 创建虚拟头节点current = dummy      # 当前节点指向虚拟头节点for val in lst:      # 遍历列表current.next = ListNode(val)  # 创建新节点并连接current = current.next        # 当前节点后移return dummy.next  # 返回虚拟头节点的下一个节点,即真正的头节点# 辅助函数:将链表转换为列表
def linkedlist_to_list(head):result = []         # 初始化结果列表current = head      # 当前节点指向头节点while current:      # 遍历链表result.append(current.val)  # 将当前节点的值添加到列表current = current.next      # 当前节点后移return result                   # 返回结果列表# 示例用法
if __name__ == "__main__":# 创建链表 1->2->3->4->5head = list_to_linkedlist([1, 2, 3, 4, 5])# 使用迭代方法反转链表solution = Solution()reversed_head = solution.reverseList(head)print("迭代方法反转后的链表:", linkedlist_to_list(reversed_head))# 重新创建链表 1->2->3->4->5head = list_to_linkedlist([1, 2, 3, 4, 5])# 使用递归方法反转链表reversed_head_recursive = solution.reverseListRecursive(head)print("递归方法反转后的链表:", linkedlist_to_list(reversed_head_recursive))

http://www.lqws.cn/news/177985.html

相关文章:

  • 【redis实战篇】第八天
  • 越狱蒸馏-可再生安全基准测试
  • Science Robotics:UCLA 贺曦敏团队综述自主软体机器人
  • 绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
  • AI大模型学习三十三、HeyGem.ai 服务端(ubuntu)docker 安装 /客户端(win)分离部署
  • 【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
  • 智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
  • vscode使用系列之快速生成html模板
  • LlamaFactory × 多模态RAG × Chat-BI:万字长文探寻RAG进化轨迹,打造卓越专业AI助手
  • 安卓基础(ProGuard vs R8)
  • FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码
  • 【Linux】Linux 进程间通讯-管道
  • gitlab CI/CD本地部署配置
  • WebRTC 与 WebSocket 的关联关系
  • 【JVM】Java虚拟机(一)——内存结构
  • Qt生成日志与以及报错文件(mingw64位,winDbg)————附带详细解说
  • 在Windows下利用LoongArch-toolchain交叉编译Qt
  • 【PmHub面试篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现面试专题解析
  • 数据库SQLite基础
  • Ubuntu18.6 学习QT问题记录以及虚拟机安装Ubuntu后的设置
  • 【Qt】:设置新建类模板
  • C/C++ 面试复习笔记(4)
  • Excel 发现此工作表中有一处或多处公式引用错误。请检查公式中的单元格引用、区域名称、已定义名称以及到其他工作簿的链接是否均正确无误。弹窗
  • 关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
  • excel数据对比找不同:6种方法核对两列数据差异
  • 天机学堂(学习计划和进度)
  • 内容力重塑品牌增长:开源AI大模型驱动下的智能名片与S2B2C商城赋能抖音生态种草范式
  • ESP8266(NodeMcu)+GPS模块+TFT屏幕实现GPS码表
  • 【PhysUnits】16.1 完善Var 结构体及其运算(variable.rs)
  • 多种风格导航菜单 HTML 实现(附源码)