劍指offer - 鏈表中倒數(shù)第k個節(jié)點

題目

輸入一個鏈表咧栗,輸出該鏈表中倒數(shù)第k個節(jié)點。

為了符合大多數(shù)人的習(xí)慣虱肄,本題從1開始計數(shù)致板,即鏈表的尾節(jié)點是倒數(shù)第1個節(jié)點。例如咏窿,一個鏈表有6個節(jié)點斟或,從頭節(jié)點開始,它們的值依次是1集嵌、2萝挤、3、4根欧、5怜珍、6.這個鏈表的倒數(shù)第3個節(jié)點是值為4的節(jié)點。

分析

  • 思路1

假設(shè)整個鏈表有n個節(jié)點咽块,那么倒數(shù)第k個節(jié)點就是從頭節(jié)點開始的第n-k+1個節(jié)點绘面。如果我們能夠得到鏈表中節(jié)點的個數(shù)n,那么只要從頭節(jié)點開始往后走n-k+1步就可以了侈沪。

如何得到節(jié)點數(shù)n?這個不難揭璃,只需要從頭開始遍歷鏈表,每經(jīng)過一個節(jié)點亭罪,計數(shù)器加1就行了瘦馍。也就是說為我們需要遍歷鏈表兩次,第一次統(tǒng)計出鏈表中節(jié)點的個數(shù)应役,第二次就能找到倒數(shù)第k個節(jié)點情组。功能可以實現(xiàn),但是效果不佳

  • 思路2

實現(xiàn)只遍歷鏈表一次就能找到倒數(shù)第k個節(jié)點箩祥,我們可以定義兩個指針院崇。第一個指針從鏈表的頭指針開始遍歷向前走k-1步,第二個指針保持不動袍祖;從第k步開始底瓣,第二個指針也開始從鏈表的頭指針開始遍歷,由于兩個指針距離保持在k-1蕉陋,當(dāng)?shù)谝粋€指針(走在前面的)到達(dá)鏈表的尾節(jié)點時捐凭,第二個(走在后面)指針正好指向倒數(shù)第k個節(jié)點

具體分析

下面以有6個節(jié)點的鏈表中找倒數(shù)第3個節(jié)點拨扶。

  • 首先用第一個指針從頭結(jié)點開始向前走(2=3-1)步到達(dá)第3個結(jié)點,如下圖(a)所示茁肠。
  • 接著把第二個指針初始化指向鏈表的第一個結(jié)點患民,如下圖(b)所示
  • 最后讓兩個指針同時向前遍歷,當(dāng)?shù)谝粋€指針到達(dá)鏈表的尾結(jié)點時垦梆,第二個指針指向的剛好是倒數(shù)第3個結(jié)點匹颤,如下圖(c)所示
download.png

算法實現(xiàn)

struct ListNode
{
    int value;
    ListNode *next;
};

ListNode* FindKthToTail(ListNode *listHead, unsigned int k)
{
    ListNode *head = listHead;
    ListNode *behind = nullptr;

    // 第一個指針移動k-1個位置
    for (unsigned int i = 0; i < k - 1; i++) {
        head = head->next;
    }

    // 將第二個指針設(shè)置為頭指針
    behind = listHead;

    // 移動第一個指針一直到尾結(jié)點
    while (head->next != nullptr) {
        head = head->next;
        behind = behind->next;
    }

    return behind;
}

看起來實現(xiàn)沒有問題,但是程序很容易奔潰

  • 輸入的listHead為空指針奶赔。由于代碼會試圖訪問空指針指向的內(nèi)存惋嚎,從而造成程序奔潰
  • 輸入的以listHead為頭結(jié)點的鏈表的結(jié)點的總數(shù)少于k。由于for循環(huán)中會在鏈表上向前走k-1步站刑,仍然會由于空指針而造成程序的奔潰
  • 輸入?yún)?shù)k為0另伍,由于k是一個無符號整數(shù),那么在for循環(huán)k-1得到的將不是-1绞旅,而是4294967295(無符號的oxffffffff)摆尝。因此,for循環(huán)執(zhí)行的次數(shù)遠(yuǎn)遠(yuǎn)超出我們的預(yù)計因悲,同樣會造成程序的奔潰

因此堕汞,一定要注意代碼的容錯處理,保持代碼的健壯性晃琳。針對上面3個問題讯检,分別處理。

  • 如果輸入的鏈表頭指針為nullptr卫旱,那么整個鏈表為空人灼,此時查找倒數(shù)第k個結(jié)點自然應(yīng)該返回
  • nullptr。如果輸入的k為0顾翼,也就是試圖查找倒數(shù)第0個結(jié)點投放,由于我們計算是從1開始,因此輸入0沒有實際意義适贸,也可以返回nullptr
  • 如果鏈表的結(jié)點數(shù)少于k灸芳,那么for循環(huán)中遍歷鏈表可能會出現(xiàn)指向nullptrnext,因此在for循環(huán)中加一個if判斷
ListNode* FindKthToTail(ListNode *listHead, unsigned int k)
{
    if (listHead == nullptr || k == 0)
        return nullptr;

    ListNode *head = listHead;
    ListNode *behind = nullptr;

    // 第一個指針移動k-1個位置
    for (unsigned int i = 0; i < k - 1; i++) {
        if (head->next != nullptr)
        {
           head = head->next;
        }
        else {
            return  nullptr;
        }
    }

    // 將第二個指針設(shè)置為頭指針
    behind = listHead;

    // 移動第一個指針一直到尾結(jié)點
    while (head->next != nullptr) {
        head = head->next;
        behind = behind->next;
    }

    return behind;
}

參考

《劍指offer》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拜姿,一起剝皮案震驚了整個濱河市烙样,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蕊肥,老刑警劉巖谒获,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡究反,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門儒洛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來精耐,“玉大人,你說我怎么就攤上這事琅锻∝酝#” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵恼蓬,是天一觀的道長惊完。 經(jīng)常有香客問我,道長处硬,這世上最難降的妖魔是什么小槐? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮荷辕,結(jié)果婚禮上凿跳,老公的妹妹穿的比我還像新娘。我一直安慰自己疮方,他們只是感情好控嗜,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骡显,像睡著了一般疆栏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惫谤,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天壁顶,我揣著相機(jī)與錄音,去河邊找鬼石挂。 笑死博助,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痹愚。 我是一名探鬼主播富岳,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拯腮!你這毒婦竟也來了窖式?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤动壤,失蹤者是張志新(化名)和其女友劉穎萝喘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡阁簸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年爬早,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片启妹。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡筛严,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饶米,到底是詐尸還是另有隱情桨啃,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布檬输,位于F島的核電站照瘾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丧慈。R本人自食惡果不足惜析命,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逃默。 院中可真熱鬧碳却,春花似錦、人聲如沸笑旺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倦沧。三九已至偎球,卻和暖如春伪货,著一層夾襖步出監(jiān)牢的瞬間油狂,已是汗流浹背袄膏。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工默色, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留谎势,地道東北人藤韵。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓虐沥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泽艘。 傳聞我的和親對象是個殘疾皇子欲险,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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