【数据结构】(图解)leetcode刷题之单链表(上)
👋大家好呀!这个是付青云同学的博客
目前一直在学习C语言。🐸
写博客是为了来记录我的学习过程,同时也希望通过博客能够帮助到需要帮助的人。
如果我的博客可以帮助到你,不妨给我一个关注哦😁文章目录
今天端午节,😁先祝大家端午节快乐呀!!!
当然,学无止境,假期也不要忘记提升自己喔~
最近在学数据结构,学了的知识后当然要巩固一下,所以就找了一些经典的链表题写一写,同时也分享一下我做题的一些思路。那现在,就开始吧!!
另外:这个系列文章将会有上中下三部分,难度递增,中 下篇正努力制作中。。。
反转链表👈
题目描述如下(具体可以点击上方链接):
👉方法一:头插法
思路:
创建一个newhead,将原链表按顺序头插。
如图:
代码如下:
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
如图:
代码如下:
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;}
链表的中间节点👈
题目描述如下(具体可以点击上方链接):
👉方法一:暴力求解法
思路:
遍历链表,记录链表节点个数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就是中间结点。
如图:
代码如下:
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个节点👈
题目描述如下(具体可以点击上方链接):
思路:
先让fast走k步,fast和slow一起走,当fast==NULL时,输出slow
如图:
代码如下:
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; }