反转链表算法:指针很多,重点是怎么分析

原题目链接:https://leetcode-cn.com/problems/reverse-linked-list/

解题思路

示例:“1”->“2”->“3”->“4”
我们先用p1,p2,p3,p4分别代表指向1,2,3,4的指针,然后来分析反转的过程是怎样进行的。

  1. 尾指针清空,p1->next == NULL
  2. 依次将后一个元素放在最前面一个元素的前面,
    p2->next = p1;
    p3->next = p2;
    p4->next = p3;
  3. 返回头指针,return p4

我们可以看到左边是p2,p3,p4,右边是p1,p2p,p3,可以猜到只需要两个变量p和pp,其中pp在原链表中是p->next。
所以迭代式是:

pp->next = p;
p = pp;
pp = pp->next;

可以看到pp = pp->next;在复制时,原值已经更新了,因此需要一个临时变量temp保存做过值,因此最终的迭代式为:

temp = pp->next;
pp->next = p;
p = pp;
pp = temp;

最后判断一下:
初始条件:

struct ListNode *temp = head, *p0 = head, *p1 = head->next;
head->next = NULL;

终止条件:
p1 == NULL,也就是说没有下一个元素需要放在最前面一个元素的前面

特殊值:

  if(head == NULL || head->next == NULL){
        return head;
    }

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head){
    if(head == NULL || head->next == NULL){
        return head;
    }
    struct ListNode *temp = head, *p0 = head, *p1 = head->next;
    head->next = NULL;
    while(p1 != NULL){
        temp = p1->next;
        p1->next = p0;
        p0 = p1;
        p1 = temp;
    }
    return p0;
}

欢迎帮我去原帖点个赞:
https://leetcode-cn.com/problems/reverse-linked-list/solution/zhi-zhen-hen-duo-zhong-dian-shi-zen-yao-9oogl/

突然发现CSDN可以打赏了,余额有闲钱的道友欢迎给我打赏哈,本人缺钱。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

朽木白露

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

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

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

打赏作者

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

抵扣说明:

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

余额充值