給定單鏈表,檢測是否有環(huán)录别。如果有環(huán)朽色,則求出進(jìn)入環(huán)的第一個節(jié)點(diǎn)。
判斷單向鏈表是否有環(huán)组题,可以采用快指針與慢指針的方式來解決纵搁。即定義一個快指針fast和一個慢指針slow,使得fast每次跳躍兩個節(jié)點(diǎn)往踢,slow每次跳躍一個節(jié)點(diǎn)。如果鏈表沒有環(huán)的話徘层,則slow與fast永遠(yuǎn)不會相遇(這里鏈表至少有兩個節(jié)點(diǎn))峻呕;如果有環(huán),則fast與slow將會在環(huán)中相遇趣效。
然后獲取環(huán)的入口點(diǎn)方法如圖所示:
給定兩個單鏈表(鏈表自身無環(huán))瘦癌,檢測兩個鏈表是否有交點(diǎn),如果有返回第一個交點(diǎn)跷敬。
檢測兩個單鏈表是否有交點(diǎn)是很容易的讯私,因為如果兩個鏈表有交點(diǎn),那么這兩個鏈表的最后一個節(jié)點(diǎn)必須相同,所以只需比較最后一個節(jié)點(diǎn)即可斤寇。但是這種方案是無法求出第一個交點(diǎn)的桶癣,所以需要另辟蹊徑。另外娘锁,判斷是否有交點(diǎn)可以轉(zhuǎn)換成鏈表是否有環(huán)的問題牙寞。讓一個鏈表的最后一個節(jié)點(diǎn)指向第二個鏈表的頭結(jié)點(diǎn),這樣的話莫秆,如果相交间雀,則新的鏈表是存在環(huán)的,并且交點(diǎn)便是環(huán)的入口點(diǎn)镊屎。
給定兩個單鏈表(不確定是否帶環(huán))惹挟,判斷是否有交點(diǎn)
先判斷兩個鏈表是否帶環(huán);
i).如果兩個都不帶環(huán)缝驳,可以用:判斷兩個無環(huán)單鏈表是否有交點(diǎn)连锯。
ii).兩個都帶環(huán):找到兩個入環(huán)點(diǎn)r1,r2,環(huán)1的入環(huán)點(diǎn)為r1党巾,從r1開始遍歷一圈萎庭,每個結(jié)點(diǎn)如r2比較
iii).一個帶環(huán)一個不帶環(huán),則肯定不相交齿拂。
給定單鏈表頭結(jié)點(diǎn)驳规,刪除鏈表中倒數(shù)第k個結(jié)點(diǎn)
這個問題的關(guān)鍵是需要獲取倒數(shù)第k個節(jié)點(diǎn)。如何獲取呢署海?這里吗购,需要兩個指針p和q,p指向頭結(jié)點(diǎn)砸狞,q指向距離頭結(jié)點(diǎn)為k的節(jié)點(diǎn)捻勉。這樣p和q每次遍歷一個節(jié)點(diǎn),當(dāng)q遍歷到末尾的時候刀森,p指向的節(jié)點(diǎn)即為倒數(shù)第k個節(jié)點(diǎn)踱启,然后刪除即可。
只給定單鏈表中某個結(jié)點(diǎn)p(并非最后一個結(jié)點(diǎn)研底,即p->next!=NULL)指針埠偿,刪除該結(jié)點(diǎn);
只給定單鏈表中某個結(jié)點(diǎn)p(非空結(jié)點(diǎn))榜晦,在p前面插入一個結(jié)點(diǎn)冠蒋。
上訴兩種方法的原理都是一樣的。