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

python-leetcode 23.反转链表

题目:

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


方法一:迭代

在遍历链表时,将当前节点的next指针改为指向前一个节点。由于节点没有引用其前一个节点,因此要先存储前一个节点,在更改引用之前,还要存储后一个节点,最后返回新的头引用。

链表注意:上一个,现在,下一个的关系

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def reverseList(self, head):
        """
        :type head: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        prev=None  #用来追踪上一个节点的指针,初始为空
        curr=head   #当前处理的节点,初始化为链表的头节点
        while curr is not None:
            next_node=curr.next  #当前节点指向的下一个节点
            curr.next=prev  #反转当前节点的指向,让当前节点指向前一个节点
            prev=curr #将前一指针移动到当前节点curr,以便下一个节点反转时,当前节点成为下一个节点的前驱节点
            curr=next_node #指针后移,继续遍历
        return prev

时间复杂度:O(N)

空间复杂度:O(1)


方法二:递归

 假设链表为:n1​→…→nk−1​→nk​→nk+1​→…→nm​→∅

若从节点nk+1到nm已经被反转,而我们处于nk,n1​→…→nk−1​→nk​→nk+1​←…←nm​

希望nk.next.next=nk

需要注意的是 n1​ 的下一个节点必须指向 ∅。如果忽略了这一点,链表中可能会产生环。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def reverseList(self, head):
        """
        :type head: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        if head is None or head.next is None:  #链表为空或者链表只有一个节点,返回当前节点
            return head
        newhead=self.reverseList(head.next) #对链表的下一个节点递归调用,直到链表末尾
        head.next.next=head #反转指针,当前节点head设为下一个节点head.next 的下一个节点
        head.next=None  #将当前节点 head 的 next 指针设为 None,避免形成环
        return newhead

时间复杂度:O(N) 

空间复杂度:O(N)

相关文章:

  • 【ubuntu24.04】 强制重启导致大模型的磁盘挂载出错
  • RockyLinux AlmaLinux RedHat 8,9安装图形化
  • Golang的多团队协作编程模式与实践经验
  • 大模型笔记:pytorch实现MOE
  • 华硕笔记本怎么一键恢复出厂系统_华硕笔记本一键恢复出厂系统教程
  • 支持向量机原理
  • NGINX相关的知识点
  • TUSB422 MCU 软件用户指南
  • Java LinkedList(单列集合)
  • 解决 paddle ocr 遇到 CXXABI_1.3.13 not found 的问题
  • 【设计模式】【行为型模式】迭代器模式(Iterator)
  • python卷积神经网络人脸识别示例实现详解
  • 如何避免大语言模型中涉及丢番图方程的问题
  • STM32 I2C通信协议说明
  • 微信小程序自定义tabbar,跳转tabbar后页面加载路径不正确
  • 机械学习基础-5.分类-数据建模与机械智能课程自留
  • kotlin标准库里面也有很多java类
  • PySide(PyQT)使用场景(QGraphicsScene)进行动态标注的一个demo
  • 鸿蒙HarmonyOS NEXT开发:横竖屏切换开发实践
  • Golang 进阶训练营
  • wordpress国外主题安装/惠州seo排名外包
  • 池州网站优化公司/网络营销的目的是什么
  • 免费个人网站建站源码/广告推广接单平台
  • 微信微网站怎么做/站长工具seo综合查询网
  • 影响网站显示度的原因/百度网盘怎么找资源
  • 做网站哪家强/近期国际新闻