zoukankan      html  css  js  c++  java
  • 【Leetcode链表】反转链表(206)

    题目

    反转一个单链表。

    示例:

    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL
    

    进阶:
    你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

    解答

    能用两种方法

    • 三个指针,改变指向完成反转
    • 用递归,回溯完成节点的指向反转

    通过代码如下:

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    # 用三个指针,前一个p,当前c,后一个n
    class Solution:
        def reverseList(self, head: ListNode) -> ListNode:
            c, p = head, None  # p初始是Null节点
            while c:
                # n = c.next  # 当前节点后一个
                # c.next = p  # 重要,当前节点指向后一个
                # p = c       # 后移前节点,为当前节点c后移做准备
                # c = n       # 后移当前节点
    
                # 并行,不存在赋值顺序
                # So炫酷的写法,劳资只能照着上面式子改,主要还是笨!
                c.next, p, c = p, c, c.next
            return p
    # 时间复杂度O(n),空间复杂度O(1)
    
    
    
    # # 递归解法: 时间复杂度O(n),空间复杂度O(n)
    # class Solution:
    #     def reverseList(self, head: ListNode) -> ListNode:
    #         if head==None or head.next == None:
    #             return head
    #         p = self.reverseList(head.next)
    #         head.next.next = head
    #         head.next = None
    #         return p
    # # 不妨假设链表为1,2,3,4,5。按照递归,当执行reverseList(5)的时候返回了5这个节点,reverseList(4)中的p就是5这个节点,我们看看reverseList(4)接下来执行完之后,5->next = 4, 4->next = null。这时候返回了p这个节点,也就是链表5->4->null,接下来执行reverseList(3),代码解析为4->next = 3,3->next = null,这个时候p就变成了,5->4->3->null, reverseList(2), reverseList(1)依次类推,p就是:5->4->3->2->1->null
    
  • 相关阅读:
    javascript解决方案插件
    vscode前端快速开发插件
    html5新增语义标签
    vscode快捷键大全
    vscode/sublime前端开发快捷键
    vscode自动缩进快捷键
    Android平台OpenGL ES/Assimp/OpenCV/GLM集成说明
    将AOSP源码导入到Android Studio进行查看
    Android OTA升级
    Android构建系统
  • 原文地址:https://www.cnblogs.com/ldy-miss/p/11924009.html
Copyright © 2011-2022 走看看