美文网首页
【简单】Leetcode-206 反转链表

【简单】Leetcode-206 反转链表

作者: 砥砺前行的人 | 来源:发表于2021-05-08 11:56 被阅读0次

    题目描述

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


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

    解法一

    迭代法,通过双指针标记前后继节点

    class Solution:
        def reverseList(self, head: ListNode) -> ListNode:
            # 迭代方法
            # 定义前继,后继指针
            pre, cur = None, head
            while cur:
                # 完成前后的next变换。Python 语言特性可以省略中间变量
                cur.next, pre, cur = pre, cur, cur.next
            return pre
    

    解法二

    递归。将问题拆分成当前节点与剩余的节点,只需要将剩余节点的第一个节点指向当前节点即可

    class Solution:
        def reverseList(self, head: ListNode) -> ListNode:
            # 1 -> 2 -> 3 -> 4 -> 5
            #       __________________
            # 1 <- | 2 -> 3 -> 4 -> 5 | 
            #       ------------------
            #            _____________
            # 1 <- 2 <- | 3 -> 4 -> 5 |
            #            -------------
    
            # 如果输入为空列表,则直接返回
            if not head: return head
            # 如果输入为最后一个节点,则返回当前节点,开始弹栈
            if not head.next: return head
            
            # 递归
            newHead = self.reverseList(head.next)
            
            # 设置第一个节点的next为当前节点
            head.next.next = head
            # 将当前节点的next置空。如果不设置,则对于最后一次弹栈,原链表头结点会指向第二个节点,导致无限循环
            head.next = None
            
            # 返回新链表的头结点
            return newHead
    

    相关文章

      网友评论

          本文标题:【简单】Leetcode-206 反转链表

          本文链接:https://www.haomeiwen.com/subject/xycudltx.html