当前位置:   article > 正文

力扣第206题:反转链表_leetcode第206题—反转链表

leetcode第206题—反转链表

小白随机在互联网上乱扔一些赛博垃圾,还望拨冗批评斧正。

目录

题目描述

方法一:迭代

方法二:递归


题目描述

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

示例 1:

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

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

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

方法一:迭代

假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3。

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

  1. struct ListNode* reverseList(struct ListNode* head) {
  2.     struct ListNode* prev = NULL;
  3.     struct ListNode* curr = head;
  4.     while (curr) {
  5.         struct ListNode* next = curr->next;
  6.         curr->next = prev;
  7.         prev = curr;
  8.         curr = next;
  9.     }
  10.     return prev;
  11. }


复杂度分析

时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次。

空间复杂度:O(1)。

方法二:递归

递归版本稍微复杂一些,其关键在于反向工作。假设链表的其余部分已经被反转,现在应该如何反转它前面的部分?

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

  1. struct ListNode* reverseList(struct ListNode* head) {
  2. if (head == NULL || head->next == NULL) {
  3. return head;
  4. }
  5. struct ListNode* newHead = reverseList(head->next);
  6. head->next->next = head;
  7. head->next = NULL;
  8. return newHead;
  9. }

复杂度分析

时间复杂度:O(n),其中 n 是链表的长度。需要对链表的每个节点进行反转操作。

空间复杂度:O(n),其中 n 是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n 层。


题目网址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/209410
推荐阅读
相关标签
  

闽ICP备14008679号