剑指 Offer 24. 反转链表

98 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

剑指 Offer 24. 反转链表

一、题目描述:

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

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

限制:

0 <= 节点个数 <= 5000

注意:本题与主站 206 题相同:leetcode-cn.com/problems/re…

来源:力扣(LeetCode) 链接:leetcode.cn/problems/fa… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

这部分可以写写:

  1. 这道题考察了什么思想?你的思路是什么?

    我们可以使用双指针来实现链表反转,首先我们需要搞两个指针,一个可以为pre,一个为cur。pre在前,cur在后。我们只需要让pre指针的next指向cur,就可以实现这部分的反转,然后pre和cur同时往前一个位置,再局部反转,一直到pre到链表尾部即结束。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    是一次通过的,对于链表的题目,我们最好是画一画图!

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

image.png

```
 struct ListNode* reverseList(struct ListNode* head) {
     if (head == NULL || head->next == NULL) {
         return head;
     }
     struct ListNode* newHead = reverseList(head->next);
     head->next->next = head;
     head->next = NULL;
     return newHead;
 }
 ​
 作者:LeetCode-Solution
 链接:https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof/solution/fan-zhuan-lian-biao-by-leetcode-solution-jvs5/
 来源:力扣(LeetCode)
 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
```

三、AC 代码:

 /**
  * Definition for singly-linked list.
  * struct ListNode {
  *     int val;
  *     struct ListNode *next;
  * };
  */
 ​
 ​
 struct ListNode* reverseList(struct ListNode* head){
     struct ListNode *prev = NULL,*cur = head;
     while(cur){
         struct ListNode* tail = cur->next;
         cur->next = prev;
         prev = cur;
         cur = tail;
     }
     return prev;
 }

四、总结:

如果你还有更多的思考、分析、总结,通通都加上来吧~

剑指 Offer 24. 反转链表

对于链表的题目,我们最好是画一画图!

  1. 反转链表 - 力扣(LeetCode)leetcode.cn/problems/re…

双指针迭代动画演示如下:

img

递归解法动画演示如下:

img

动图作者:wang_ni_ma

链接:leetcode.cn/problems/re…

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。