【日拱一卒】鏈表——鏈表反轉(zhuǎn)

需求

實(shí)現(xiàn)鏈表的反轉(zhuǎn)

輸入:1->2->3->4->5

輸出:5->4->3->2->1

難點(diǎn)

如果換成數(shù)據(jù)反轉(zhuǎn)疚脐,你會(huì)嗎(傻子才不會(huì))璧榄。

按照常規(guī)思維,鏈表反轉(zhuǎn)需要知道最后一個(gè)元素革半,然后從最后一個(gè)元素依次往前找丛晦,直到遍歷到第一個(gè)元素即完成反轉(zhuǎn)。

但是這里并不是雙向鏈表涩馆,即使找到最后一個(gè)元素也找不到前繼節(jié)點(diǎn)行施。再者,即使是雙向鏈表魂那,通過(guò)找到尾結(jié)點(diǎn)再往回遍歷聽(tīng)著也不像是很高端的做法悲龟。

思路

除了找到尾結(jié)點(diǎn)進(jìn)行反轉(zhuǎn)的思路,我們是否可以考慮冰寻,在遍歷的同時(shí)就去做反轉(zhuǎn)的操作须教,類似

1->2->3->4->5

2->1->3->4->5

3->2->1->4->5

4->3->2->1->5

5->4->3->2->1

直覺(jué)告訴我們,肯定沒(méi)問(wèn)題斩芭,但是具體怎么做呢轻腺,看圖

第一步:畫出輸入鏈表結(jié)構(gòu)

image.png

第二步:初始化

image.png

注意

  • 為了不干擾head指針,重新定義一個(gè)新的cur指針划乖,用于后面的遍歷贬养。pre指針表示最終反轉(zhuǎn)后的鏈表指針

  • 指針存儲(chǔ)了指向變量的地址,比如這里的cur存儲(chǔ)的是head.next的地址

第三步:將1節(jié)點(diǎn)的next指向pre(即null)

image.png

注意

  • 此時(shí)的pre指向的是一個(gè)null的地址琴庵,需要注意的是pre是一個(gè)指針误算,pre還可以指向其他節(jié)點(diǎn)(參見(jiàn)下一步操作)

第四步:將pre指向1節(jié)點(diǎn)

image.png

注意

  • 將pre指向指向節(jié)點(diǎn)1,pre之前指向的是null迷殿,現(xiàn)在指向節(jié)點(diǎn)1儿礼,所以圖中虛線部分的連接就不存在了
  • 這時(shí)候,我們成功的將第一個(gè)節(jié)點(diǎn)納入最終反轉(zhuǎn)鏈表pre中

第五步:解決指針丟失問(wèn)題

按照前面幾步的思路庆寺,我們依次遍歷后面的節(jié)點(diǎn)蚊夫,并對(duì)遍歷的節(jié)點(diǎn)做如上步驟的處理,這樣懦尝,最終我們就會(huì)得到反轉(zhuǎn)后的鏈表pre知纷。

但是,這里有個(gè)指針丟失的問(wèn)題陵霉。

原來(lái)cur指向節(jié)點(diǎn)1琅轧,cur.next指向節(jié)點(diǎn)2,但是在第三步的時(shí)候?qū)ur.next指向了null踊挠。所以使用cur.next就無(wú)法滿足我們遍歷節(jié)點(diǎn)2的需求了乍桂。

這時(shí)候,我們需要一個(gè)新指針,用來(lái)保證鏈表遍歷的時(shí)候不會(huì)斷掉模蜡,如下圖

image.png

注意

  • 這里next指針需要在第二步初始化的時(shí)候就做好漠趁,不然這時(shí)候做next=cur.next就無(wú)法指向節(jié)點(diǎn)2了

第六步:開(kāi)啟下一次迭代

image.png

注意

  • cur作為一個(gè)哨兵節(jié)點(diǎn),指向節(jié)點(diǎn)2忍疾,開(kāi)始像處理節(jié)點(diǎn)1一樣處理節(jié)點(diǎn)2闯传,直到遍歷完所有節(jié)點(diǎn)

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

版本1

func reversrList(head *ListNode) *ListNode {
    cur := head
    var pre *ListNode = nil
    for cur != nil {
        next := cur.Next
        cur.Next = pre
        pre = cur
        cur = next
    }
    return pre
}

對(duì)照該代碼實(shí)現(xiàn)和上面幾個(gè)步驟,基本就可以摸透鏈表反轉(zhuǎn)的思路了卤妒。

這里還有一個(gè)更加簡(jiǎn)潔的代碼實(shí)現(xiàn)

版本2

func reversrList(head *ListNode) *ListNode {
    cur := head
    var pre *ListNode = nil
    for cur != nil {
        pre, cur, cur.Next = cur, cur.Next, pre
    }
    return pre
}

個(gè)人感覺(jué)不是很好理解甥绿,所以將其拆解成上面的代碼實(shí)現(xiàn)。

不忘初心

老王:你不好好種地则披,你以后長(zhǎng)大能干什么

小王:學(xué)算法

老王:學(xué)算法共缕?!你數(shù)組士复、鏈表图谷、棧、隊(duì)列阱洪、堆便贵、排序、查找都整不明白冗荸,你學(xué)什么算法

小王:我只學(xué)鏈表反轉(zhuǎn)

老王:承璃。。蚌本。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盔粹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子程癌,更是在濱河造成了極大的恐慌舷嗡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件席楚,死亡現(xiàn)場(chǎng)離奇詭異咬崔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)烦秩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)郎仆,“玉大人只祠,你說(shuō)我怎么就攤上這事∪偶。” “怎么了抛寝?”我有些...
    開(kāi)封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盗舰,道長(zhǎng)晶府,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任钻趋,我火速辦了婚禮川陆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛮位。我一直安慰自己较沪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布失仁。 她就那樣靜靜地躺著尸曼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萄焦。 梳的紋絲不亂的頭發(fā)上控轿,一...
    開(kāi)封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音拂封,去河邊找鬼解幽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烘苹,可吹牛的內(nèi)容都是我干的躲株。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼镣衡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼霜定!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起廊鸥,我...
    開(kāi)封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤望浩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后惰说,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體磨德,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年吆视,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了典挑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啦吧,死狀恐怖您觉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情授滓,我是刑警寧澤琳水,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布肆糕,位于F島的核電站,受9級(jí)特大地震影響在孝,放射性物質(zhì)發(fā)生泄漏诚啃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一私沮、第九天 我趴在偏房一處隱蔽的房頂上張望始赎。 院中可真熱鬧,春花似錦顾彰、人聲如沸极阅。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筋搏。三九已至,卻和暖如春厕隧,著一層夾襖步出監(jiān)牢的瞬間奔脐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工吁讨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留髓迎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓建丧,卻偏偏與公主長(zhǎng)得像排龄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翎朱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355