資料結構 單鏈錶環的問題

2021-10-01 04:57:44 字數 2146 閱讀 1325

在前面的博文中,我們提到過這一思想,快慢指標可以用來尋找乙個鍊錶的中間節點,同時可以尋找單鏈表倒數第k個節點,而在此處,它大有作用

我們常常定義兩個指標,乙個快指標乙個慢指標,快指標一次走兩步,慢指標一次走一步,當快指標和慢指標相交的時候,該鍊錶就是帶環鍊錶

面試問題:一定要快指標走兩步,慢指標走一步嗎?修改之後可行否?請證明

解答:只有快指標走兩步慢指標走一步滿足。

證明如下圖:

題目1:

思路分析:

要尋找公共的節點,我們先定義兩個指標指向頭,然後通過遍歷鍊錶得到兩個鍊錶的長度,進而得到長度差count,令長的鍊錶向前走count位,此時讓兩個指標就滿足向前走同時入相同節點,再以兩個指標是否相等位判斷條件尋找。

注意的點:

1、要考慮到傳入指標的為null的情況

2、兩個指標向前走,要考無交點的情況(兩個鍊錶若有交點,則最後乙個點必然相同)

函式功能:尋找兩個相交鍊錶的焦點

入口引數:鍊錶a的頭、鍊錶b的頭

返回值:null||相交節點的指標

*/plistnode *

getintersectionnode

(plistnode *heada, plistnode* headb)

while

(n2)

if(n1 != n2)

return

null

; count =

abs(num1 - num2)

; n1 = heada;

n2 = headb;

if(num1>num2)

}else

}while

(n1 != n2)

return n1;

}題目2:

思路分析:

快慢指標思想,具體參考上面快慢指標的講述,這裡直接寫**

/*

函式功能:判斷乙個鍊錶是否有環

入口引數:乙個鍊錶的頭

返回值:true||false

*/bool

hascycle

(plistnode *head)

if(fast ==

null

|| fast-

>_next ==

null

)else

return1;

}

題目三:

思路分析:

結合上述「快慢指標講述」,我們可以得到如下:

注意看紅框內的推導公式,也就是說,入環前的長度k與快慢指標相遇走的m的和是這個環的n倍,不妨假設n等於1,則從相遇點到環起始點=入環長度k

因此我們完全可以定義兩個指標,乙個從相遇點出發,另乙個從煉表頭出發,當兩個指標相等時,此時,定義乙個指標ptr,從頭開始走,slow和該指標一起每次一步的走,當二者相等的時候,就是入環節點

**如下:

/*

函式功能:尋找鍊錶的入環點

入口引數:乙個鍊錶的頭

返回值:null||入環點處的指標

*/listnode *

detectcycle

(listnode *head)

return slow;}}

return

nullptr

;}

感謝瀏覽

資料結構單鏈表問題

首先,最容易想到的方法就是遍歷一遍單鏈表,求出整個單鏈表的長度n,然後將倒數第k個,轉換為正數第n k個,接下去遍歷一次就可以得到結果。但是該方法需要對鍊錶進行兩次遍歷。第二種方法,從頭結點開始,依次對鍊錶的每乙個結點元素進行這樣的測試 遍歷k個元素,檢視是否到達鍊錶尾,直到找到那個倒數第k個元素。...

資料結構單鏈表

初學資料結構,貼段自己編寫的單鏈表程式,希望自己能夠一直以強大的學習熱情持續下去!自勉!2012年3月30日 於大連 include using namespace std typedef struct node linklist,node linklist makelist int n void ...

資料結構 單鏈表

今天浪費了好多時間,也許是心裡想著明天的考試吧 可自己也知道這次的考試,自己畢竟過不了了,只好等到今年11月份,想想那時自己已經大三了 還有那麼多時間嗎!很懊惱今天不知怎麼回事,感嘆環境真的可以影響乙個人,真的可以 把今天的學習筆記寫下來,沒有進行好好的整理,這回單鏈表的功能較多,操作比較散,最後乙...