今天看小甲鱼数据结构的视频时,其中讲了腾讯的一道面试题目!
相当经典,解法也相当不错。学习了!
普通的方法:首先遍历一遍单链表以确定单链表的长度L。然后再次从头节点出发循环L/2次找到单链表的中间节点。算法复杂度为O(L+L/2)=O(3L/2)。
能否再优化一下这个时间复杂度呢?
巧妙方法:设置两个指针*search、*mid都指向单链表的头节点。其中* search的移动速度是*mid的2倍。当*search指向末尾节点的时候,mid正好就在中间了。这也是标尺的思想。(不错)
以下是代码:
int GetMidNode(LinkList L, ElemType *e) {
LinkList search, mid;
mid = search = L;
while (search->next != NULL) {
//search移动的速度是 mid 的2倍
if (search->next->next != NULL) {
search = search->next->next;
mid = mid->next;
}
else
{
search = search->next;
mid = mid->next;
}
}
*e = mid->data;
return 1;
}