數(shù)據(jù)結(jié)構(gòu)面試 之 單鏈表是否有環(huán)及環(huán)入口點(diǎn) 附有最詳細(xì)明了的圖解

1.限制與要求

  • 不允許修改鏈表結(jié)構(gòu)姑原。
  • 時(shí)間復(fù)雜度O(n),空間復(fù)雜度O(1)往弓。

2.思考

2.1判斷是否有環(huán)

如果鏈表有環(huán)疏唾,那么在遍歷鏈表時(shí)則會(huì)陷入死循環(huán),利用這個(gè)特征函似,我們可以設(shè)計(jì)這樣的算法槐脏。

  • 使用一個(gè)slow指針,一個(gè)fast指針撇寞。
  • slow指針一次往后遍歷以1個(gè)節(jié)點(diǎn)顿天,fast指針一次往后遍歷2個(gè)節(jié)點(diǎn),一直做這樣的操作蔑担。
  • 如果fast指針在遍歷過(guò)程中牌废,遍歷到了NULL節(jié)點(diǎn)說(shuō)明鏈表沒(méi)有環(huán)。
  • 否則當(dāng)slow指針和falst指針相同啤握,則說(shuō)明環(huán)有節(jié)點(diǎn)鸟缕。

2.2環(huán)的入口節(jié)點(diǎn)

我們假定鏈表頭到環(huán)入口的距離是len,環(huán)入口到slow和fast交匯點(diǎn)的距離為x排抬,環(huán)的長(zhǎng)度為R懂从。slow和fast第一次交匯時(shí),設(shè)slow走的長(zhǎng)度為:d = len + x蹲蒲,而fast走的長(zhǎng)度為:2d = len + nR + x番甩,(n >= 1),從而我們可以得知:2len + 2x = len + nR + x届搁,即len = nR - x缘薛,(n >= 1)窍育,于是我們可以得到這樣的算法。

  • 使用一個(gè)cur指針指向鏈表頭節(jié)點(diǎn)宴胧,一個(gè)inter指針指向第一次的交匯點(diǎn)漱抓。
  • cur指針和inter指針一起往后遍歷。
  • cur指針和inter指針相等時(shí)恕齐,cur和inter指針指向的就是環(huán)的入口節(jié)點(diǎn)辽旋。

inter指針在遍歷過(guò)程中可能多次(n >= 1)經(jīng)過(guò)環(huán)入口節(jié)點(diǎn),但當(dāng)cur指針第一次達(dá)到入口節(jié)點(diǎn)時(shí)檐迟,inter指針此時(shí)必然也指向入口節(jié)點(diǎn)。

3.代碼實(shí)現(xiàn)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode * detectCycle(ListNode * head) {
        if (NULL == head) return NULL;
        ListNode * fast = head;
        ListNode * slow = head;
        
        while (1)
        {
            fast = fast->next ? fast->next : NULL;
            if (NULL == fast) break;
            
            fast = fast->next ? fast->next : NULL;
            if (NULL == fast) break;
            
            slow = slow->next;
    
            if (slow == fast) break;
        }
        
        if (NULL == fast) return NULL;
        
        ListNode * cur = head;
        ListNode * inter = slow;
        
        while (cur != inter)
        {
            cur = cur->next;
            inter = inter->next;
        }
        
        return cur;
    }
};

4.OJ練習(xí)

LeetCode 單鏈表是否有環(huán)及入口

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末码耐,一起剝皮案震驚了整個(gè)濱河市追迟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骚腥,老刑警劉巖敦间,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異束铭,居然都是意外死亡廓块,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)契沫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)带猴,“玉大人,你說(shuō)我怎么就攤上這事懈万∷┣澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵会通,是天一觀的道長(zhǎng)口予。 經(jīng)常有香客問(wèn)我,道長(zhǎng)涕侈,這世上最難降的妖魔是什么沪停? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮裳涛,結(jié)果婚禮上木张,老公的妹妹穿的比我還像新娘。我一直安慰自己调违,他們只是感情好窟哺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著技肩,像睡著了一般且轨。 火紅的嫁衣襯著肌膚如雪浮声。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,906評(píng)論 1 290
  • 那天旋奢,我揣著相機(jī)與錄音泳挥,去河邊找鬼。 笑死至朗,一個(gè)胖子當(dāng)著我的面吹牛屉符,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锹引,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼矗钟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了嫌变?” 一聲冷哼從身側(cè)響起吨艇,我...
    開(kāi)封第一講書(shū)人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腾啥,沒(méi)想到半個(gè)月后东涡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倘待,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年疮跑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凸舵。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祖娘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贞间,到底是詐尸還是另有隱情贿条,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布增热,位于F島的核電站整以,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏峻仇。R本人自食惡果不足惜公黑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摄咆。 院中可真熱鬧凡蚜,春花似錦、人聲如沸吭从。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涩金。三九已至谱醇,卻和暖如春暇仲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背副渴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工奈附, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人煮剧。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓斥滤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親勉盅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佑颇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • //leetcode中還有花樣鏈表題,這里幾個(gè)例子草娜,冰山一角 求單鏈表中結(jié)點(diǎn)的個(gè)數(shù)----時(shí)間復(fù)雜度O(n)這是最...
    暗黑破壞球嘿哈閱讀 1,514評(píng)論 0 6
  • 給出兩個(gè)單向鏈表的頭指針漩符,而兩個(gè)鏈表都可能帶環(huán),判斷這兩個(gè)鏈表是否相交驱还,并且給出他們相交的第一個(gè)節(jié)點(diǎn) 參考 1)判...
    zcwfeng閱讀 417評(píng)論 0 1
  • 判斷兩個(gè)單向鏈表是否相交,并找出他們的交點(diǎn)凸克。這個(gè)問(wèn)題我們分三種情況討論: 一. 兩個(gè)鏈表都不存在環(huán) 問(wèn)題思路: ...
    AceKitty閱讀 511評(píng)論 0 1
  • 推薦大家看下《編程之美》议蟆、《程序員面試金典》 還有編程相關(guān)網(wǎng)站:leetcode老師講的很多題其實(shí)就是這些書(shū)和網(wǎng)...
    偷天神貓閱讀 1,265評(píng)論 0 6
  • 1.如何判斷單鏈表是否有環(huán)? 第一種是尾節(jié)點(diǎn)指向頭節(jié)點(diǎn)萎战;第二種是尾節(jié)點(diǎn)指向鏈表中的某一個(gè)節(jié)點(diǎn) 解法一:追及法咐容,設(shè)置...
    是一動(dòng)不動(dòng)的friend閱讀 930評(píng)論 0 0