C++反转链表递归

文章目录

  • 题目描述
  • 解题思路
  • 代码
  • 复杂度分析

题目描述

LCR 024. 反转链表 - 力扣(LeetCode)

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

C++反转链表递归_第1张图片

解题思路

这里我们采用递归的思路来解决首先我们分为两个视角来查看问题:

①宏观的视角

首先我们坚信reverseList(ListNode* head)这个函数可以帮我们逆置链表;

所以我们第一步reverseList(head->next);

head->next->next = head;

head->next = nullptr;

最后我们返回链表的头指针即可

②将链表看成一棵树的视角

简单说就是第一个视角的展开,我们先递归到最深层:

C++反转链表递归_第2张图片

逆置操作:

C++反转链表递归_第3张图片

继续:

C++反转链表递归_第4张图片

最后:

C++反转链表递归_第5张图片

总结:

如果我们把单链表看成一棵树我们仅需进行深度优先遍历即可。

代码

class Solution {
public:
    ListNode* reverseList(ListNode* head) 
    {
        if(head == nullptr)
        return head;

        if(head->next == nullptr)
        return head;

        ListNode* NewHead = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;

        return NewHead;

    }
};

复杂度分析

时间复杂度:

只遍历了一次相当于O(N);

空间复杂度:

没有额外使用O(1);

你可能感兴趣的:(C++,力扣刷题日记,c++,链表,开发语言)