連結串列面試題之快慢指標問題(一) 查詢連結串列中間節點
阿新 • • 發佈:2019-02-08
查詢連結串列中間節點
一.問題描述
給點一個連結串列,返回該連結串列的中間節點。
二.問題分析
假定一個連結串列中節點資料依次為(單數):1->2->3->4->5->(NULL),基於這個問題,首先我們會想到一種比較low的解決辦法:遍歷整個連結串列,得到連結串列總個數,取連結串列中值,再遍歷一遍連結串列,找出連結串列中間節點(節點3)。當你寫出這種程式碼的時候,面試官肯定會讓你將其優化,程式碼執行效率較低。換種角度思考這個問題:假設分別定義一個快指標(走兩步)和慢指標(走一步),當快指標遍歷完整個連結串列時,慢指標剛好指向連結串列中間節點,這樣我們通過只遍歷一遍連結串列的方式得到連結串列中間節點。
三.問題解決
1.程式碼實現
2.程式碼測試typedef int DataType; //定義結構體 typedef struct LinkNode { DataType data; //data存放指標資料 struct LinkNode *next; //next為指向連結串列下一個節點指標域 }*pLinkNode,*pLinkList; //查詢連結串列中間節點 pLinkNode FindMidNode(pLinkList *pHead) { assert(*pHead); pLinkNode slow=*pHead; //慢指標 pLinkNode fast=*pHead; //塊指標 while(fast && fast->next) //迴圈條件缺一不可(缺少程式會崩潰),連結串列節點個數可能為為奇數或偶數 { slow=slow->next; //慢指標走一步 fast=fast->next->next; //快指標走兩步 } return slow; //返回中間節點 }
(1)連結串列個數為奇數
(2)連結串列個數為偶數