數據結構與算法學習筆記03(騰訊面試題)
題目:快速找到未知長度單鏈表的中間節點。
普通的方法很簡單,首先遍歷一遍單鏈表以確定單鏈表的長度L。然後再次從頭節點出發循環L/2次找到單鏈表的中間節點。
算法複雜度爲:O(L+L/2)=O(3L/2)。
能否再優化一下這個時間複雜度呢?
有一個很巧妙的方法:利用快慢指針!
利用快慢指針原理:設置兩個指針*search、*mid都指向單鏈表的頭節點。其中*search的移動速度是*mid的2倍。當*search指向末尾節點的時候,mid正好就在中間了。這也是標尺的思想。
實現:
bool GetMidNode(LinkList L, ElemType *e){
LinkList search, mid;
mid = search = L;
while (search->next)
{
if (search->next->next!=NULL)
{
search = search->next->next;
mid = mid->next;
}
else
{
search = search->next;
}
}
*e = mid->data;
retun true;
}