实现方式有二:
1、常规方法:
(1)遍历一遍单链表,计算单链表的长度L
(2)计算中间节点j为L/2,(或者当L为奇数时:(L-1)/2)
(3)从来开始查找,直到查找到第j个节点
{
linklist p;
int count = 0;
int midCount = 0;
int i = 0;
p = *L;
if (!p)
{
return Error
}
while( p->next != NULL) //遍历链表,得到链表长度
{
p = p->next;
count += 1;
}
midCount = int (count/2); //得到中间结点的个数
p = *L;
for( ;i < midCount; i++)
{
P = P->next;
}
*e = p->data;return *e; //返回中间节点
}
2、高级方法
(1)定义两个指针,都从头结点出发,但是一个是快指针,一个是慢指针,快指针一次走两个,慢指针一次走一个当快指针遍历完链表时,慢指针正好走到,链表的中间。
Status findMidNode(linklist *L,ElemType *e)
{
linklist p,q;
p = *L;
q = *L;
if (!p)
{
return Error
}
while( p->next != NULL)
{
if (p->next->next != NULL)
{
p = p->next->next;
q = q->next
}
else
{
p = p->next;
}
}
*e = q->ata;
return *e
}
对比:常规方法时间复杂度O(1.5*n),高级方法时间复杂度O(0.5 * n)。