题目链接

题目描述

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

示例

示例1:

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

提示

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

    思路

    思路1:迭代

    0206-反转链表 - 图1

    思路2:递归

    0206-反转链表 - 图2

题解

思路1:迭代

  1. class Solution {
  2. public:
  3. ListNode* reverseList(ListNode* head) {
  4. ListNode* prev = nullptr;
  5. ListNode* curr = head;
  6. while (curr) {
  7. ListNode* next = curr->next;
  8. curr->next = prev;
  9. prev = curr;
  10. curr = next;
  11. }
  12. return prev;
  13. }
  14. };

思路2:递归

class Solution {
   public:
    ListNode* reverseList(ListNode* head) {
        if (head == nullptr || head->next == nullptr) {
            return head;
        }
        ListNode* p = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;

        return p;
    }
};

复杂度分析

思路1:迭代

  • 时间复杂度:0206-反转链表 - 图3
  • 空间复杂度:0206-反转链表 - 图4

    思路2:递归

  • 时间复杂度:0206-反转链表 - 图5

  • 空间复杂度:0206-反转链表 - 图6