题目:快速找到未知长度单链表的中间结点。
既然是面试题就一定有普通方法和高级方法,而高级方法无疑会让面试官大大加分!
普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头结点出发循环L/2次找到单链表的中间结点。
算法复杂度为:O(L+L/2)=O(3L/2)。
能否再优化呢?有一个很巧的方法:利用快慢指针!
利用快慢指针原理:设置两个指针*search、 *mid 都指向单链表的头结点。其中 *search 的移动速度是 *mid 的2倍。当 *search 指向末尾结点的时候,*mid 正好就在中间了。
实现代码:
GetMidNode.c
int GetMidNode( LinkList L ,ElemType *e )
{
LinkList search,mid;
mid = search = L;
while( search->next != NULL )
{
if( search->next->next != NULL )
{
search = search->next-next;
mid = mid->next;
}
else
{
search = search->next;
}
}
*e = mid->data;
return 1;
}
接下来就写一个完整的代码:实现随机生成20个元素的链表(尾插法或者头插法任意),用我们刚才学到的方法快速查找中间结点的值并且显示。
#include <stdio.h>
#include <stdlib.h>
#incl