Leetcode 206. 反转链表
题目
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
思路
-
双指针法:
- 首先定义一个cur指针,指向头节点,在定义一个pre指针,初始化NULL
- 先建立一个临时节点tmp保存cur的下一个节点
- 然后cur->next = pre
- pre = cur
- cur = tmp
-
递归法
本质上和双指针方法是一致的
代码
- 双指针法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* tmp;// 临时节点 保存cur的下一个节点 因为cur的next要改方向
ListNode* cur = head;
ListNode* pre = NULL;
while(cur != NULL)
{
tmp = cur->next;// 保存下一个节点
cur->next = pre;// 翻转操作
pre = cur;// 将pre指针指向cur
cur = tmp;// 将cur指针下移
}
// 翻转之后 那么cur = NULL pre指向第一个节点
return pre;
}
};
- 递归法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
// 初始化
return reverse(nullptr,head);
}
ListNode* reverse(ListNode* pre,ListNode* cur)
{
if(cur == nullptr) return pre;//链表为空
ListNode* tmp = cur->next;//保存下一个节点
cur->next = pre;
// 下面的递归写法就是做了下面这两步
// pre = cur;
// cur = temp;
return reverse(cur,tmp);
}
};