持续创作,加速成长!这是我参与「掘金日新计划 · 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… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
这部分可以写写:
-
这道题考察了什么思想?你的思路是什么?
我们可以使用双指针来实现链表反转,首先我们需要搞两个指针,一个可以为pre,一个为cur。pre在前,cur在后。我们只需要让pre指针的next指向cur,就可以实现这部分的反转,然后pre和cur同时往前一个位置,再局部反转,一直到pre到链表尾部即结束。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
是一次通过的,对于链表的题目,我们最好是画一画图!
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
```
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;
}
四、总结:
如果你还有更多的思考、分析、总结,通通都加上来吧~
对于链表的题目,我们最好是画一画图!
- 反转链表 - 力扣(LeetCode)leetcode.cn/problems/re…
双指针迭代动画演示如下:
递归解法动画演示如下:
动图作者:wang_ni_ma
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。