1、题目:反转链表
给你单链表的头节点
head
,请你反转链表,并返回反转后的链表。
2、解题思路
方法一:递归
递归的两个条件:
- 终止条件是当前节点或者下一个节点==null
- 在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数那句
head.next.next = head
很不好理解,其实就是 head 的下一个节点指向head。
递归函数中每次返回的 cur 其实只最后一个节点,在递归函数内部,改变的是当前节点的指向。
动画演示如下:
方法二:双指针迭代
我们可以申请两个指针,第一个指针叫 pre,最初是指向 null 的。
第二个指针 cur 指向 head,然后不断遍历 cur。
每次迭代到 cur,都将 cur 的 next 指向 pre,然后 pre 和 cur 前进一位。
都迭代完了(cur 变成 null 了),pre 就是最后一个节点了。
动画演示如下:
3、代码
//双指针迭代代码
class Solution {
public:
ListNode* reverseList(ListNode* head)
{
ListNode* pre = nullptr;
ListNode* cur = head;
ListNode* tmp = nullptr;
while(cur!=nullptr)
{
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};
//递归
class Solution {
public:
ListNode* reverseList(ListNode* head)
{
if(head==nullptr || head->next==nullptr)
{
return head;
}
ListNode* cur = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return cur;
}
};