鍊錶(特別是單鏈表)的定位是鍊錶這種資料結構的乙個軟肋所在,定位某乙個元素你
就不得不通過遍歷的方式獲得。如果要尋找乙個單鏈表的中間節點,普通的方法就是先遍歷得到鍊錶的長度,然後再通過長度遍歷得到鍊錶的中間節點。當然有一些鍊錶通過乙個特殊的頭節點記錄鍊錶的長度的情況,可能要簡單一些。
前一段時間,在看鍊錶的歸併排序的時候,就不得不面臨著尋找鍊錶中間節點的問題。這裡給出一種實現,很可能是大家想不到的:):
1) 使用兩個指標進行遍歷,快指標每次步進2,慢指標每次步進1;
2) 當快指標到達鍊錶尾部的時候,慢指標指向的就是鍊錶的中點。
這個演算法的思想和經典問題「判定鍊錶中是否存在環」的思想是一致的,但是如果不是
有啟發,真的是很難想出來:)。
實現原始碼為:
尋找鍊錶中間節點
cpp view plain copy include include include include typedef intdatatype typedef struct linknode linknode,plinknode 結點結構體 typedef struct linklist linkl...
尋找鍊錶中間節點
include include include include typedef intdatatype typedef struct linknode linknode,plinknode 結點結構體 typedef struct linklist linklist plinklist 鍊錶 函式原...
利用快慢指標尋找鍊錶中間節點
876.鍊錶的中間結點 這道題要求我們找到鍊錶中的中間位置,首先想到第一種方法,使用兩個指標,乙個從頭遍歷到尾部確定長度,乙個從頭遍歷到相應位置。那麼有沒有一遍遍歷就能解決的?那麼我們想到快慢指標,因為快慢指標往往可以做到一遍遍歷,在慢指標處找到答案 做法 慢指標走一步,快指標走兩步。這樣快指標到末...