👋大家好呀!这个是付青云同学的博客
目前一直在学习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;
}