鏈表-雙指針妙用

1.?返回鏈表的中間節(jié)點

給定一個帶有頭結點 head 的非空單鏈表盲憎,返回鏈表的中間結點幼驶。如果有兩個中間結點汇鞭,則返回第二個中間結點凄敢。

分析:

快慢指針同時指向頭節(jié)點碌冶,快指針走兩步,慢指針走一步

如果長度為偶數(shù)涝缝,那么快指針為NULL的時候停止扑庞,長度為奇數(shù),fast->next為NULL的時候停止

慢指針指向的位置就是中間節(jié)點了

按照這種思路拒逮,實現(xiàn)代碼如下:

LinkNode?*findMidNode(LinkNode?*head)

{

LinkNode?*fast?=?head;

LinkNode?*slow?=?head;

while(NULL!=?fast?&&NULL!=?fast->next?)

{

fast?=?fast->next->next;

slow?=?slow->next;

}

returnslow;

}


2.鏈表的中間節(jié)點

輸入一個單向鏈表罐氨,輸出該鏈表中倒數(shù)第k個結點。為符合計數(shù)習慣滩援,本題從1開始計數(shù)栅隐,即鏈表的尾節(jié)點是倒數(shù)第1個節(jié)點。

例子

如:一個鏈表有6個節(jié)點玩徊,從頭節(jié)點開始租悄,它們的值依次是1、2恩袱、3泣棋、4、5憎蛤、6外傅。這個鏈表的倒數(shù)第3個節(jié)點是值為4的節(jié)點。

分析:

定義兩個指針俩檬,指針移動一個快萎胰,一個慢(鏈表的長度l)

1.快慢指針同時指向頭結點

2.首先快指針移動k-1步,先走到第k個節(jié)點

3.快慢指針同時移動棚辽,直到快指針指向末尾技竟,這時,快慢指針都走了l-k屈藐,

4.慢指針指向的節(jié)點即為我們需要尋找的節(jié)點

參考代碼實現(xiàn)如下:

LinkNode?*FindKthToTail(LinkNode?*head,unsignedintk)

{

????if(NULL?==?head?||?0?==?k)

????????return?head;

????LinkNode?*pFast?=?head;

????LinkNode?*pSlow?=?head;

????unsigned?int?i?=?0;

????//快指針先移動

????while(i?<?k?-1)

????{

????????if(NULL?!=?pFast)

????????{

????????????pFast?=?pFast->next;

????????}

????????//k大于鏈表的長度

????????else

????????{

????????????return?NULL;

????????}

????????i++;

????}

????//快慢指針一起移動

????while(NULL?!=?pFast->next)

????{

????????pSlow?=?pSlow->next;

????????pFast?=?pFast->next;

????}

????return?pSlow;

}


3.判斷鏈表是否有環(huán)

如何判斷一個單鏈表是否有環(huán)榔组?若有環(huán),如何找出環(huán)的入口節(jié)點联逻。

按照快慢指針的思路搓扯,使用兩個指針,一個指針每次走一步包归,另一個每次走兩步锨推,如果鏈表有環(huán),那么它們終將相遇,而如果沒有環(huán)换可,快的指針最后會指向NULL椎椰。

按照這種思路,我們的參考代碼如下:

//0:無環(huán)沾鳄,1:有環(huán)

int hasLoop(LinkNode *head)

{

? ? if(NULL == head)

? ? ? ? return 0;

? ? ? ? LinkNode *slow = head;

? ? ? ? LinkNode *fast = head->next;

? ? ? ? //當快指針到末尾時慨飘,無環(huán),結束

? ? ? ? while (NULL != fast? && NULL != slow)

? ? ? ?{

? ? ? ? ? ? //快慢相遇译荞,有環(huán)

? ? ? ? ? ? if (fast == slow)

? ? ? ? ? ? ? ? return 1;

? ? ? ? ? ? ? ? slow = slow->next; // 慢指針每次走一步

? ? ? ? ? ? ? ? fast = fast->next;

? ? ? ? ? ? ? ? if (fast != NULL)

? ? ? ? ? ? ? ? ? ? fast = fast->next;

? ? }

? ? return 0;

}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瓤的,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子磁椒,更是在濱河造成了極大的恐慌堤瘤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浆熔,死亡現(xiàn)場離奇詭異本辐,居然都是意外死亡,警方通過查閱死者的電腦和手機医增,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門慎皱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叶骨,你說我怎么就攤上這事茫多。” “怎么了忽刽?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵天揖,是天一觀的道長。 經常有香客問我跪帝,道長今膊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任伞剑,我火速辦了婚禮斑唬,結果婚禮上,老公的妹妹穿的比我還像新娘黎泣。我一直安慰自己恕刘,他們只是感情好,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布抒倚。 她就那樣靜靜地躺著褐着,像睡著了一般。 火紅的嫁衣襯著肌膚如雪托呕。 梳的紋絲不亂的頭發(fā)上含蓉,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天洋访,我揣著相機與錄音,去河邊找鬼谴餐。 笑死,一個胖子當著我的面吹牛呆抑,可吹牛的內容都是我干的岂嗓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼鹊碍,長吁一口氣:“原來是場噩夢啊……” “哼厌殉!你這毒婦竟也來了?” 一聲冷哼從身側響起侈咕,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤公罕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耀销,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楼眷,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年熊尉,在試婚紗的時候發(fā)現(xiàn)自己被綠了罐柳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡狰住,死狀恐怖张吉,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情催植,我是刑警寧澤肮蛹,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站创南,受9級特大地震影響伦忠,放射性物質發(fā)生泄漏。R本人自食惡果不足惜扰藕,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一缓苛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邓深,春花似錦未桥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萌壳,卻和暖如春亦镶,著一層夾襖步出監(jiān)牢的瞬間日月,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工缤骨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爱咬,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓绊起,卻偏偏與公主長得像精拟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虱歪,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容