演算法面試題 快速找到未知長度單鏈表的中間節點

2021-08-14 09:14:37 字數 1816 閱讀 8516

有道演算法面試題:快速找到未知長度單鏈表的中間節點。

你可以普通方法也可用比較好的方法,去解決這個問題。

由於單鏈表不知道長度,必須遍歷完整個單鏈表才知道單戀表的長度,然後根據一般的長度去找中間結點,這是普通方法。

當然題目問的是快速找到,當然要用快速的方法啦。

這裡我們快慢指標的方法來解決這個問題,快指標每次走2個結點,慢指標每次走1個結點,當快指標走完鍊錶,慢指標剛好走到中間,這就是快慢指標的核心思想

下面直接看**,只要我們知道核心思想,然後把**完善好,就ok了。**裡面也有注釋,使用c寫的哈。

#define _crt_secure_no_warnings

#include #include #include #include /*

寫乙個完整的程式,實現隨機生成20個元素的鍊錶(尾插法或頭插法)

用快慢指標快速查詢中間結點的值並顯示。

*/#define ok 1;

#define error 0;

typedef int eletype;

typedef int status;

//單鏈表結點結構

typedef struct linknode

linknode,*linklist;

/*採用尾插法建立單鏈表

*/status createlinklist(linklist* list,int num)

linknode* node = (linknode*)malloc(sizeof(linknode));//建立頭結點

*list = node;//鍊錶指向頭結點

node->next = null;//初始化空鍊錶

//設定隨機種子

srand((size_t)time(null));

for (size_t i = 0; i < num; i++)

return ok;}/*

通過指標返回單鏈表中間結點的值

*/status getmidval(linklist list,eletype* data)

//當結點為偶數個時,在倒數第二個結點無法走2個結點,就走乙個結點

else

}/* 當前快指標走完煉表時,慢指標剛好走到 中間結點。

實際上當結點數是奇數時 慢指標 走到 中間結點,

當結點數是偶數時,此時中間結點有2個,此時慢指標指向靠前那個結點。

舉個例子 1 3 5 7 9 快指標第一次走到 5 第二次走到 9 然後鍊錶走完,慢指標走2步 剛好走到 中間結點5

1 3 5 7 快指標第一次走到 5 第二次越界只走一步然後鍊錶走完,快指標走2步慢指標走1步,快指標走1步時慢指標沒有走,故慢指標 走到結點 3。

如果想 當結點個數為偶數個時,慢指標指向 中間2個結點靠後那個結點,那麼當快指標走1步時,慢指標也走1步。

*/ *data = slow->data;

return ok;}/*

展示單鏈表資料

*/void showlinklist(linklist list)

printf("\n");

}int main(int argc, char *argv)

驗證結果:

做演算法題大家要多積累,這樣才會有演算法的思維,才能做到見多識廣!

騰訊 快速找到未知長度單鏈表的中間節點

普通的方法很簡單,首先遍歷一遍單鏈表以確定單鏈表的長度l。然後再次從頭節點出發迴圈l 2次找到單鏈表的中間節點。演算法複雜度為o l l 2 o 3l 2 能否再優化一下這個時間複雜度呢?有乙個很巧妙的方法 設定兩個指標 fast slow都指向單鏈表的頭節點。其中 fast的移動速度是 slow的...

單鏈表面試 找到未知長度的單鏈表的中間節點

找到未知長度的單鏈表的中間節點普通方法 1.確定單鏈表長度l,2.再次找到l 2次的中間節點。快速方法 快慢指標 原理 設定兩個指標search md都指向單鏈表的頭節點。其中search的移動速度是mid的2倍。當 search指向末尾節點的時候,mid正好就在中間了。這也是標尺的思想。快慢指標要...

面試題 單鏈表快速排序

給定乙個單鏈表,請使用快速排序演算法對其排序 要求 期望平均時間複雜度為o nlogn 期望額外空間複雜度為o logn 思考題 如果只能改變鍊錶結構,不能修改每個節點的val值該如何做呢 資料範圍 鍊錶中的所有數大小均在int範圍內,鍊錶長度在 0,10000 輸入樣例 5,3,2 輸出樣例 2,...