數據結構與算法學習筆記03(騰訊面試題)

數據結構與算法學習筆記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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章