牛客网刷题-反转链表

✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!!
个人主页:@rivencode的个人主页
系列专栏:《牛客网刷题》
推荐一款模拟面试、刷题神器,从基础到大厂面试题点击跳转开启刷题模式

前言:
想要学好嵌入式,C语言与数据结构是必要熟练掌握的,而想熟练掌握一门语言,必须经过大量的练习,刷题,至少需要一两万行的代码量,才能具有一定的编程能力,至少拿到一个功能,怎么去用编程语言去实现它,从现在开始我要开启刷题之路,提高自己的编程水平,还有最重要的面试能力。
推荐一款刷题神器 ->
点击跳转进入网站(数据结构算法方向)

在这里插入图片描述

导航

  • 一.反转链表
  • 二.链表的中间结点
  • 三.如何高效刷题

一.反转链表

题目原型:
牛客网刷题-反转链表_第1张图片
输入输出示例:
牛客网刷题-反转链表_第2张图片
1.题目分析:题目意思很简单就是链表头尾交换,将整个链表反向连接起来,实现之后返回新链表的头结点。

2.解题思路:

  • 思路一:翻转指针
    我们可以不动结点本身,而可以将每个结点的next指针(本来是指向下一个结点),我们将它指向前一个结点,而第一个结点就指向空(表示新链表的尾结点)。
    牛客网刷题-反转链表_第3张图片
    代码实现:
    牛客网刷题-反转链表_第4张图片
struct ListNode* ReverseList(struct ListNode* pHead ) {
    // write code here
    if(pHead == NULL)
    {
        return NULL;
    }
    struct ListNode * n1=NULL,*n2=pHead,*n3=pHead->next;
    while(n2 !=NULL)
    {
        n2->next=n1;
        n1=n2;
        n2=n3;
        if(n3!=NULL)
        n3=n3->next;
    }
    return n1;
}
  • 思路二:头插法
    创建一个新的空链表,将旧链表上的结点一个一个头插至新链表,这样就实现的反转链表,旧链表的尾结点变成新链表的头。
    牛客网刷题-反转链表_第5张图片
    代码实现:
    牛客网刷题-反转链表_第6张图片
struct ListNode* ReverseList(struct ListNode* pHead ) {
    // write code here
    struct ListNode * cur=pHead;
    struct ListNode * NewHead=NULL;
    
    while(cur != NULL)
    {
        struct ListNode * next=cur->next;
        //链表头插
        cur->next=NewHead;
        NewHead=cur;
        cur=next;
    }
    return NewHead;
}

二.链表的中间结点

题目原型:
牛客网刷题-反转链表_第7张图片
1.题目分析:
题目意思很简单就是返回链表中的中间结点,如果是奇数个结点那只有一个中间结点返回这个结点即可,如果是偶数个结点那就会有两个中间结点,题目要求返回第二个结点。

2.解题思路:

  • 思路一:遍历链表
    大部分人都可以想的到,你要返回中间结点,我可以先遍历一遍链表求出结点个数,这样就可以知道中间结点的位置,在遍历一遍就能找到链表的中间结点。但是这样需要遍历两遍链表有点麻烦(不推荐)。

代码实现
牛客网刷题-反转链表_第8张图片

struct ListNode* middleNode(struct ListNode* head ) {
    // write code here
    struct ListNode* cur=head;
    int count=0;
    //求出结点数
    while(cur !=NULL)
    {
        count++;
        cur=cur->next;
    }
    //中间结点位置
    count=count/2;
   struct ListNode* middle=head;
    //找出中间结点
    while(count--)
    {
        middle=middle->next;
    }
    return middle;
}
  • 思路二:快慢指针
    用两个指针来遍历链表,一个一次走一步,一个一次走两步,一个块一个慢所以叫快慢指针,因为一个指针走的是另一个指针路程的两倍,轻易就找到中间结点,而且只需遍历链表一遍。
    牛客网刷题-反转链表_第9张图片
    代码实现:
    牛客网刷题-反转链表_第10张图片
struct ListNode* middleNode(struct ListNode* head ) {
    // write code here
    struct ListNode* slow=head,*fast=head;
    while(fast !=NULL && fast->next !=NULL )
    {
        slow=slow->next;
        fast=fast->next->next;
    }
        return slow;
}

三.如何高效刷题

如何刷题:
1.如果你是基础不太好,可以先按照题解,跟着手打代码,重点理解题目思路,将题目所用到的知识点,解题技巧提炼出来(锻炼代码能力,解题思路)。在这里插入图片描述
2.当有一定的代码能力之后,但是看题还是没有思路,可以先看解题思路理解它,然后尝试用代码去实现它。(主要锻炼代码能力,进一步锻炼解题思维)

3.拿到一个题目自己先尝试解题,最好是能将解题思路用画图的方式体现出来,这样更能加深印象,然后用代码实现,实现之后再看看题解,或者别人的解题方法,进行对比,找到最优解题思路
在这里插入图片描述
最后:在解题过程中,碰到问题如下图(题目提交后通不过,报错(代码可能有bug),尽量独立思考,可以先尝试用它的测试用例,一步一步走读代码,看看问题出现在那个地方,如果实在是没有看出来,可以将该函数拷贝到VS中进行调试代码,一定能找出来。(锻炼自己的代码调试能力)

总结:
要想学好嵌入式C语言是根本,但是也离不开数据结构,尤其是链表、队列方面的知识,就接下来我要更新的freerots实时操作系统,就需要用到大量的链表和队列的知识,要想提高自己的编程水平,笔试能力和面试技巧,就得大量刷题手打代码
->点击跳转进入网站(数据结构算法方向)

在这里插入图片描述

你可能感兴趣的:(牛客网刷题,链表,数据结构)