206. 反转链表https://leetcode-cn.com/problems/reverse-linked-list/
难度简单
给你单链表的头节点 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
题解
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode*cur=head;//保存当前节点
ListNode*temp;//保存下一个节点
ListNode*pre=NULL;
while(cur){
temp=cur->next;
cur->next=pre;
pre=cur;
cur= temp;
}
return pre;
}
快慢指针法 即设置两个指针 pre始终在cur之前 然后一次次的移动 直到cur为空 画个图很好理解
class Solution {
public:
ListNode* reverse(ListNode* pre,ListNode* cur){
if(cur == NULL) return pre;
ListNode* temp = cur->next;
cur->next = pre;
// 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步
// pre = cur;
// cur = temp;
return reverse(cur,temp);
}
ListNode* reverseList(ListNode* head) {
// 和双指针法初始化是一样的逻辑
// ListNode* cur = head;
// ListNode* pre = NULL;
return reverse(NULL, head);
}
};
递归法 好理解却不好写 虽然是相同的思路
总结:这道题并不是很难 还是见得少了 涉及数组和链表的移动都可以想想快慢指针法