LeetCode【206.反转链表】(1)

11 篇文章 2 订阅
7 篇文章 1 订阅

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


题目分析

这个是一个热门题,很多校招,笔试什么的频繁出现。
简单读题后我们基本了解它是要求我们实现什么
就是将链表倒置, 如图:

在这里插入图片描述
既然题目并没有对时间复杂度和空间复杂度有要求,那我们就直接上手吧


解决方案

思路一:翻指针方向

先用三个指针,让n1指向NULL,n2指向链表第一个结点,n3链表第二个结点,如图:
在这里插入图片描述
一般来说重复过程的程序分为三步:

  1. 初始条件
    我们初始条件就是用三个指针,分别指向空,第一个结点和第二个结点。
  2. 迭代过程
    第一步:让n2指向n1,这一步就实现了链表第一个结点的翻转
    在这里插入图片描述
    第二步:让上面三个指针分别向后移动一个结点(将n1指向n2;再让n2指向n3;最后使n3指向它的下一个结点n3->next)。
  3. 结束条件
    我们迭代过程中的第一步是让n2去翻转,那么就当n2指向NULL的时候截止。
    过程如图:
    在这里插入图片描述
    在这里插入图片描述

思路一代码:

struct ListNode* reverseList(struct ListNode* head){
    if(head==NULL)
        return NULL;
    //初始条件
    struct ListNode*n1=NULL,*n2=head,*n3=n2->next;
    while(n2!=NULL)//结束条件
    {
        //迭代过程
        n2->next=n1;
        n1=n2;
        n2=n3;
        if(n3)
        n3=n3->next;
    }
    return n1;
}

思路二:头插法

顾名思义,头插法就是沿用头插的思想。先新建一个链表,将旧链表中的结点以头插的方式放到新链表中即可。
第一步: 定义一个指针指向head,在定义一个新链表newHead。
第二步:定义一个next用来记录cur后面那一个结点,将cur指向的结点放到newHead前面,再将newHead指向cur,cur再向后走。

旧链表head的流程图:
在这里插入图片描述
新链表newHead的流程图:
在这里插入图片描述


思路二代码:

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode*cur=head;
    struct ListNode*newHead=NULL;
    while(cur!=NULL)
    {
        struct ListNode*next=cur->next;

        //头插
        cur->next=newHead;
        newHead=cur;
        cur=next;
    }
    return newHead;
}

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

#唐解元

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

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

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

打赏作者

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

抵扣说明:

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

余额充值