[LeetCode]反转链表

在这里插入图片描述

[LeetCode]反转链表


题目

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

在这里插入图片描述
链接:https://leetcode-cn.com/problems/reverse-linked-list/submissions/


分析

这里我们用两种方法实现:

①调整链表方向

在这里插入图片描述

按照上述分析,我们可以得出代码:

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* n1,*n2,*n3;
    n1 = NULL;
    n2 = head;
    n3 = head->next;

    while(n2)
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if(n3)
        	n3 = n3->next;
    }
    return n1;
}

可当我们运行时,我们得出的结果为:

在这里插入图片描述
这里说我们存在空指针的问题,我们再一次画图分析

在这里插入图片描述
此时我们的n3指针指向空,我们在这一趟进行调整元素间的箭头时,调整失败,所以我们增加对n3
指针的判断

    while(n2)
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if(n3)
        	n3 = n3->next;
    }

这个时候我们在运行代码,我们得出的结果为
在这里插入图片描述
这个时候我们得出我们为考虑如果我们要反转的链表为NULL的情况,所以我们增加对链表的判断

if(head == NULL)
        return head;

此时,我们再一次运行代码得出
在这里插入图片描述


②头插法

这里我们对题目中给出的例子再进行分析
在这里插入图片描述
如果有不熟悉链表中头插接口的实现,可以浏览/复习
https://blog.csdn.net/weixin_52664715/article/details/120336834?spm=1001.2014.3001.5501

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* cur = head;
    struct ListNode* newhead = NULL;
    while(cur)
    {
        struct ListNode* next = cur->next;//我们先保存cur的下一个节点的地址
        cur->next = newhead;//让cur指向newhead
        newhead = cur;//让newhead移动,为了让下一个元素指向头结点
        cur = next;
    }
    return newhead;
}

此时,我们运行代码得出
在这里插入图片描述

代码

struct ListNode* reverseList(struct ListNode* head){
    if(head == NULL)
        return head;

    struct ListNode* n1,*n2,*n3;
    n1 = NULL;
    n2 = head;
    n3 = head->next;

    while(n2)
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if(n3)
            n3 = n3->next;
    }

    return n1;
    
}

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* cur = head;
    struct ListNode* newhead = NULL;
    while(cur)
    {
        struct ListNode* next = cur->next;
        cur->next = newhead;
        newhead = cur;
        cur = next;
    }
    return newhead;
}

总结

我们在解决题目时,经常会使用我们在学习时学习的接口内容,所以我们对常见的接口进行复习和扩展,因为我们上述题目在使用头插法时与我们学习时的接口内容并不相同,但两者的思路相同

以上就是我对这种方法的个人理解

上述内容如果有错误的地方,还麻烦各位大佬指教【膜拜各位了】【膜拜各位了】
在这里插入图片描述

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr、Jerry

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

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

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

打赏作者

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

抵扣说明:

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

余额充值