题目
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
解题思路
思路一
用双指针的思路,一个指向要反转的节点,一个指向该节点的前置元素,反转之后俩指针都右移(必须前指针先右移)继续同样操作直到后指针指向了nullptr,再返回其前置指针作为头节点。
以下是代码
//双指针法
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 = nullptr;
ListNode* pre = nullptr;
ListNode* cur = head;
while (cur)
{
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};
思路二
还可以采用递归算法,其本质上还是用的双指针,代码如下
//递归方法
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* reverse(ListNode* pre, ListNode* cur)
{
if (cur == nullptr)return pre;
ListNode* tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
return reverse(pre, cur);
}
ListNode* reverseList(ListNode* head)
{
return reverse(nullptr, head);
}
};