快速查找未知長度單鏈表的中間節點

快速查找未知長度單鏈表的中間節點

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;
              }
      }
}


 

發佈了231 篇原創文章 · 獲贊 36 · 訪問量 142萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章