> 文档中心 > 【数据结构】(图解)leetcode刷题之单链表(上)

【数据结构】(图解)leetcode刷题之单链表(上)


👋大家好呀!这个是付青云同学的博客
目前一直在学习C语言。🐸
写博客是为了来记录我的学习过程,同时也希望通过博客能够帮助到需要帮助的人。
如果我的博客可以帮助到你,不妨给我一个关注哦😁

文章目录

  • 反转链表👈
    • 👉方法一:头插法
    • 👉方法二:翻转法
  • 链表的中间节点👈
    • 👉方法一:暴力求解法
    • 👉方法二:快慢指针法
  • 倒数第k个节点👈

今天端午节,😁先祝大家端午节快乐呀!!!
当然,学无止境,假期也不要忘记提升自己喔~
最近在学数据结构,学了的知识后当然要巩固一下,所以就找了一些经典的链表题写一写,同时也分享一下我做题的一些思路。那现在,就开始吧!!
另外:这个系列文章将会有上中下三部分,难度递增,中 下篇正努力制作中。。。
【数据结构】(图解)leetcode刷题之单链表(上)

反转链表👈

题目描述如下(具体可以点击上方链接):
【数据结构】(图解)leetcode刷题之单链表(上)

👉方法一:头插法

思路:
创建一个newhead,将原链表按顺序头插。

如图:
【数据结构】(图解)leetcode刷题之单链表(上)
代码如下:

struct ListNode* reverseList(struct ListNode* head){    struct ListNode* n1=head;    struct ListNode* newHead=NULL; while(n1)    { struct ListNode* n2=n1->next; //头插 n1->next=newHead; newHead=n1; //迭代 n1=n2;    }    return newHead;}

👉方法二:翻转法

思路:
创建三个变量n1 n2 n3,n2储存原链表头部,n3储存原链表头部的next,n1为新链表的头(初始为NULL)
同时,这里要注意原链表为NULL时,这个时候就直接返回NULL
如图:
【数据结构】(图解)leetcode刷题之单链表(上)
代码如下:

struct ListNode* reverseList(struct ListNode* head){    if(head==NULL)    { return NULL;    }    struct ListNode* n1=NULL;    struct ListNode* n2=head;    struct ListNode* n3=head->next; while(n2)    { //翻转 n2->next=n1;  n1=n2; n2=n3; if(n3) {     n3=n3->next; }    }    return n1;}

链表的中间节点👈

题目描述如下(具体可以点击上方链接):
【数据结构】(图解)leetcode刷题之单链表(上)

👉方法一:暴力求解法

思路:
遍历链表,记录链表节点个数n,再次遍历链表,返回第n/2个节点
代码如下:

struct ListNode* middleNode(struct ListNode* head){    int n=0;    struct ListNode* cur=head;    while(cur)    {    cur=cur->next; n++;    }    cur=head;    n/=2;    while(n--)    { cur=cur->next;    }    return cur;}

👉方法二:快慢指针法

思路:
定义两个指针(slow和fast),两指针一起遍历链表,slow每次走一步,fast每次走两步,当fast走到底时返回slow,slow就是中间结点。
如图:
【数据结构】(图解)leetcode刷题之单链表(上)

代码如下:

struct ListNode* middleNode(struct ListNode* head){    struct ListNode* fast,*slow;    slow=fast=head;    while(fast && fast->next)    { slow=slow->next; fast=fast->next->next;    }    return slow;}

倒数第k个节点👈

题目描述如下(具体可以点击上方链接):
【数据结构】(图解)leetcode刷题之单链表(上)
思路:
先让fast走k步,fast和slow一起走,当fast==NULL时,输出slow

如图:
【数据结构】(图解)leetcode刷题之单链表(上)
代码如下:

struct ListNode* getKthFromEnd(struct ListNode* head, int k){    struct ListNode* fast,*slow;    fast=slow=head;    while(k--)    { if(fast==NULL) {     return NULL;  } fast=fast->next;    }    while(fast)    { slow=slow->next; fast=fast->next;    }    return slow;    }