所属专栏:玩转数据结构题型
博主首页:初阳785
代码托管:chuyang785
感谢大家的支持,您的点赞和关注是对我最大的支持!!!
博主也会更加的努力,创作出更优质的博文!!
关注我,关注我,关注我,重要的事情说三遍!!!!!!!!
1.题目来源
2.题目描述
给你单链表的头结点 head ,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点
3.解题思路
这里我们引入一个重要的知识点快慢双指针。
这里要求我们找到中间节点,我们不妨创建两个变量,一个fast,一个low,low走一步的时候fast走两步。这样的话只要fast走完了low就找到了中间节点。
但是我们节点的个数有两种:
第一种:有奇数个节点。
第二种:有偶数个节点。
所以我们fast结束的标志也有两种。
第一种是:fast->next=NULL。
第二种是:fast=NULL。
至于为什么这样可以找到中间节点其实也很好理解,我们的low走一步,fast走两步,也就是说我们fast走到步数是low的两倍,所以只要fast走完了,我们的low就刚好走了fast一半的路程。
我们花个图来理解以下:
第一种结束标志:
第二种结束标志:
4.代码展示
struct ListNode* middleNode(struct ListNode* head)
{
if(head==NULL)
return NULL;
struct ListNode *fast,*low;
fast=low=head;
while(fast && fast->next)//一个奇数个一个偶数个的结束标志
{
low=low->next;
fast=fast->next->next;
}
return low;
}
5.类似题目练习
删除中间节点
这个题目和上面的题目是差不多的,大家可以点进去练习练习。