leetcode206. 反转链表,带你模拟全过程,弄懂双指针算法

反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例1:
在这里插入图片描述
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例2:
在这里插入图片描述
输入:head = [1,2]
输出:[2,1]

示例 3:
输入:head = []
输出:[]

这是一道经典easy题,但想要完全弄明白并没有那么容易。
我们使用三个指针来解决此题,分别是pre、cur和temp指针。
1.初始化指针:
pre 初始化为 NULL,它将指向反转后的链表的头节点,现在可以把它看作是原始链表头节点前面的节点。
cur 初始化为 head,它是原始链表的头节点。
temp 用于临时存储当前节点的下一个节点。
2.遍历链表:
使用 while 循环遍历链表,直到 cur 为 NULL,即链表的末尾。
3.反转节点的指针:
在循环内部,首先保存当前节点cur的下一个节点到 temp。
然后,将当前节点 cur 的 next 指针指向 pre,这样就反转了当前节点的指向。
接着,将 pre 更新为当前节点 cur,因为我们刚刚反转了它的指针,所以它现在是新的 pre。
最后,将 cur 更新为 temp,即移动到下一个节点。
4.返回反转后的链表头节点:
当循环结束时,cur 将为 NULL,此时 pre 指向原始链表的最后一个节点,也就是反转后链表的头节点。
返回 pre 作为反转后链表的头节点。

模拟过程:
初始状态:pre = NULL,cur = 1(头节点),链表是1 => 2 =>3 => 4=> 5
第一次循环:
temp = 2(cur->next)
cur->next = pre(1->next 变为 NULL)
pre = cur(pre 变为 1)
cur = temp(cur 变为 2)
链表变为NULL <=1 => 2 => 3 => 4 =>5

第二次循环:
temp = 3
2->next = 1
pre = 2
cur = 3
链表变为NULL <=1 <=2 => 3 => 4=> 5

第三次循环:
temp = 4
3->next = 2
pre = 3
cur = 4
链表变为NULL <=1 <=2 <= 3=> 4 => 5

第四次循环:
temp = 5
4->next = 3
pre = 4
cur = 5
链表变为NULL <=1 <=2 <= 3 <= 4 =>5

第五次循环:
temp = NULL
5->next = 4
pre = 5
cur = NULL(循环结束)
链表变为NULL <=1 <=2 <=3 <= 4 <=5

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
    ListNode* cur=NULL;
    ListNode* pre=head;
    while(pre)
    {
        ListNode* temp=pre->next;
        pre->next=cur;
        cur=pre;
        pre=temp;
    }
    return cur;
    }
};

完成了该题后还可以试试

leetcode92反转链表II
牛客OR152每k个一组反转链表

其中leetcode92.反转链表II,我写了详细题解,多图讲解,带你一步步理解全过程。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cider瞳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值