一、快慢指針說明
快慢是指移動步數的長短,也就是每次向前移動速度的快慢。如,指定快指針每次沿着連結清單向前移動2步,指定慢指針每次沿着連結清單向前移動1步。
二、快慢指針的應用
1、判斷單連結清單是否為循環連結清單
首先設定快慢指針的起點為連結清單的頭結點,快指針每次向前移動2步,慢指針每次向前移動1步。如果該連結清單為循環連結清單,則快指針會在不久之後追上慢指針;如果是單連結清單,則快指針會先到達連結清單的末尾。利用快慢指針解決這個問題還有一個好處是不必預先知道連結清單的長度。邏輯關系簡單明了:快指針追上慢指針=>循環連結清單,快指針到達鍊尾=>單連結清單。
運作輸出結果:

2、有序連結清單中尋找中位數
快指針的移動速度是慢指針的2倍,是以快指針到達連結清單尾巴時,慢指針到達連結清單中點。
有兩種情況需要分開考慮,即連結清單為偶數長度時,和連結清單為計數長度時。(head結點依然存儲資料)
連結清單長度為偶數時,快指針隻能到達連結清單的倒數第二個結點;則慢指針的位置為上中位數;是以傳回(上中位數+下中位數)/2。
連結清單長度為奇數時,快指針就能到達連結清單的最後一個結點;則慢指針的位置就是中位數;是以直接傳回慢指針的值。
例如,連結清單長度為4時,fast第一次移動後指向倒數第二個結點(data=3),slow第一次移動後指向第二個結點(data=2);
進入判斷fast->next->next是否為NULL,判斷成立,目前slow位置在第二個結點處(data=2),是以傳回(slow->data)+(slow->next->data)/2=2.5,即為所求中位數。
又例如,連結清單長度為3時, fast第一次移動後指向最後一個結點(data=3),slow第一次移動後指向第二個結點(data=2);
進入判斷fast->next是否為NULL,判斷成立,目前slow位置在第二個結點處(data=2),是以傳回(slow->data)=2,即為所求中位數。
代碼實作: