快速查找未知長度單鏈表的中間節點
http://hxraid.iteye.com/blog/662383
普通的方法很簡單,首先遍歷一遍單鏈表以確定單鏈表的長度L。然後再次從頭節點出發循環L/2次找到單鏈表的中間節點。算法複雜度爲O(L+L/2)=O(3L/2)。
能否再優化一下這個時間複雜度呢?有一個很巧妙的方法:設置兩個指針* fast、*slow都指向單鏈表的頭節點。其中* fast的移動速度是* slow的2倍。當* fast指向末尾節點的時候,slow正好就在中間了。這一點利用了在解決判斷單鏈表是否有環存在時候的快慢指針很巧妙
void locate(LinkedList *head){
LinkedList *fast, *slow;
fast=slow=head;
while(fast->next!=NULL){
//fast的移動速度是slow的2倍
if(fast->next->next!=Null){
fast=fast->next->next;
slow=slow->next;
}else{
fast=fast->next;
}
}
}