今天寫的函式是查詢單鏈表中的中間節點,但是要求只能遍歷一遍,如果不是這個條件來限制的話,可以先將鍊錶遍歷一遍,然後通過計數器來計算鍊錶中的資料個數然後通過迴圈來找中間的結點,但是要求只能遍歷一遍也就是說你在知道這個鍊錶中有多少個資料的同時就要知道他的中間資料是哪乙個。
這樣的話就不能通過剛剛所說的方法來實現,但是剛剛也提到了如果你在知道總共有多少個元素的同時知道他中間元素是哪乙個就可以了,也就是說,結尾狀態是乙個指標指向了鍊錶的結尾乙個指標是指向了鍊錶的中間,也就是說必須需要兩個指標來完成。
也就是我之前聽過的快慢指標問題,乙個指標走的快,乙個指標走的慢,可以想一下,乙個在結尾乙個在中間是結束的條件,那也就是說快指標走的速度是慢指標的兩倍,這樣就很容易想到,快指標每次走兩個慢指標每次走乙個。當快指標走到結尾的時候,慢指標也就走了一半。
slistnode* slistfindmidnode(slistnode* list)
else }
return slow;
}
這是具體的**實現,首先要判斷傳入的指標是不是空。之後建立兩個指標乙個快乙個慢他們的初始值都是頭指標,都從頭開始走,如果快指標的next不為空那就是還沒到結尾那就繼續走,這時候快指標需要直接動兩個,慢指標只動乙個就可以了。如果為空也就是說現在fast已經走到最後乙個了。這時候跳出迴圈,return返回當前慢指標指向的中間值即可。
C 帶頭節點的單鏈表查詢中間節點
自定義的結點結構體和頭指標結構體 cpp view plain copy include include include include typedef intdatatype typedef struct linknode linknode,plinknode 結點結構體 typedef stru...
單鏈表求中間節點
難度 兩星 單鏈表求中間節點分為兩種情況 1 單鏈表長度為奇數時,如abcde,那麼中間節點就是c。2 單鏈表長度為偶數時,如abcdef,那麼中間節點有兩個c和d。本文簡單起見就取第二個中間節點。思想 其實思想很簡單,其實就是跟 判斷單鏈表儲存的字串是否為 回文串 中求中間節點的方法一模一樣,使用...
尋找單鏈表的中間節點
思路 1 首先求解單鏈表的長度length,然後遍歷 length 2 的距離即可查到單鏈表的中間節點,但一般此種方法需要遍歷兩次鍊錶,第一次遍歷求解單鏈表的長度,第二次遍歷根據索引獲取中間節點。2 如果是雙向鍊錶,可以首尾並行,利用兩個指標乙個從頭到尾,乙個從尾到頭,當兩個指標相遇的時候,就找到中...