查找链表中间节点
一.问题描述
给点一个链表,返回该链表的中间节点。
二.问题分析
假定一个链表中节点数据依次为(单数):1->2->3->4->5->(NULL),基于这个问题,首先我们会想到一种比较low的解决办法:遍历整个链表,得到链表总个数,取链表中值,再遍历一遍链表,找出链表中间节点(节点3)。当你写出这种代码的时候,面试官肯定会让你将其优化,代码执行效率较低。换种角度思考这个问题:假设分别定义一个快指针(走两步)和慢指针(走一步),当快指针遍历完整个链表时,慢指针刚好指向链表中间节点,这样我们通过只遍历一遍链表的方式得到链表中间节点。
三.问题解决
1.代码实现
typedef int DataType;
//定义结构体
typedef struct LinkNode
{
DataType data; //data存放指针数据
struct LinkNode *next; //next为指向链表下一个节点指针域
}*pLinkNode,*pLinkList;
//查找链表中间节点
pLinkNode FindMidNode(pLinkList *pHead)
{
assert(*pHead);
pLinkNode slow=*pHead; //慢指针
pLinkNode fast=*pHead; //块指针
while(fast && fast->next) //循环条件缺一不可(缺少程序会崩溃),链表节点个数可能为为奇数或偶数
{
slow=slow->next; //慢指针走一步
fast=fast->next->next; //快指针走两步
}
return slow; //返回中间节点
}
2.代码测试
(1)链表个数为奇数
(2)链表个数为偶数