1.訪問鏈表中的某一特殊位置的節(jié)點(diǎn)
876.訪問鏈表的中間節(jié)點(diǎn):快指針是慢指針移動速度的二倍,快指針到結(jié)尾休吠,慢指針到中間唉锌。
19.刪除鏈表的倒數(shù)第N個節(jié)點(diǎn):可理解為訪問鏈表倒數(shù)第N+1個節(jié)點(diǎn)垢乙。快指針先走N+1步嘶炭,然后快慢指針同速走,快指針到結(jié)尾空節(jié)點(diǎn)逊桦,慢指針到倒數(shù)第N+1節(jié)點(diǎn)眨猎。
2.刪除鏈表中滿足某一特殊條件的節(jié)點(diǎn)
237.刪除鏈表中的節(jié)點(diǎn):直接給出了要刪除的節(jié)點(diǎn),先把這個節(jié)點(diǎn)的值換成它的下一個節(jié)點(diǎn)的值强经,然后利用這個節(jié)點(diǎn)刪除它的下一個節(jié)點(diǎn)睡陪。
203.移除鏈表val=6的元素:因?yàn)閔ead有可能被移除,所以設(shè)置dummyNode.站在前一個節(jié)點(diǎn)判斷其后面節(jié)點(diǎn)是否需要被刪除匿情。
83.刪除排序鏈表中的重復(fù)節(jié)點(diǎn)(保留一個):快慢指針兰迫,快指針遇到和慢指針相同的val則快指針后移,慢指針不動炬称;快指針遇到和慢指針不同的val則慢指針的下一個節(jié)點(diǎn)指向快指針汁果,慢指針直接跳到快指針,快指針跳到下一個節(jié)點(diǎn)玲躯。當(dāng)快指針指到為節(jié)點(diǎn)须鼎,慢指針的下一個節(jié)點(diǎn)指向快指針。
82府蔗。刪除排序鏈表中的重復(fù)節(jié)點(diǎn)(重復(fù)的一個不留):因?yàn)閔ead有可能被刪除晋控,所以設(shè)置dummyNode.設(shè)置前驅(qū)節(jié)點(diǎn)保留被刪除節(jié)點(diǎn)的前一個節(jié)點(diǎn)。剩下考慮如何確定被刪除的節(jié)點(diǎn)姓赤,設(shè)置一個快指針赡译,根據(jù)當(dāng)前節(jié)點(diǎn)和下一個節(jié)點(diǎn)的val是否重復(fù),決定快指針和前驅(qū)指針的移動方法不铆。
3.兩鏈表合并問題
2.兩數(shù)相加:兩鏈表以相加的形式進(jìn)行合并蝌焚。設(shè)置結(jié)果鏈表的preHead,因?yàn)樾枰獎?chuàng)建head裹唆。循環(huán)時等兩個列表都走到尾為結(jié)束條件,其中必然有一個先走到結(jié)尾只洒,則先走到結(jié)尾的不繼續(xù)next,并且把它缺少的位數(shù)看做0占位许帐。
445.兩數(shù)相加II:和上一題相比主要差別在于,上一題數(shù)字在鏈表中低位在前毕谴,本題數(shù)字在鏈表中是高位在前成畦。上一題可以按照訪問的順序做加法,本題不行涝开。如果先走到鏈表結(jié)尾就沒辦法往回加了循帐,同時題目要求不能改變(翻轉(zhuǎn))鏈表。所以借助stack,把兩個鏈表反向存儲舀武,然后按照上一題的方法做就行了拄养。
21.合并兩個有序鏈表:設(shè)置preHead節(jié)點(diǎn),同時對兩個鏈表進(jìn)行遍歷银舱,每次取較小的節(jié)點(diǎn)作為待合并節(jié)點(diǎn)瘪匿,以最短鏈表到頭為循環(huán)結(jié)束條件。剩余的部分直接連接到后面寻馏。
23.合并K個排序鏈表:在合并兩個的基礎(chǔ)上柿顶,組對合并(可相鄰組對,也可采用頭尾組對)
4.旋轉(zhuǎn)列表相關(guān)(完全或者部分)
206.反轉(zhuǎn)鏈表:核心操作是當(dāng)前節(jié)點(diǎn)指針指向前一個節(jié)點(diǎn)操软,輔助操作是保存當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn)嘁锯,因?yàn)橥瓿珊诵牟僮骱螅乱粋€節(jié)點(diǎn)就丟失了聂薪。
92.反轉(zhuǎn)鏈表II:核心操作和上一題一樣家乘,輔助操作是找到反轉(zhuǎn)區(qū)間的前一個節(jié)點(diǎn),以便最后接上藏澳。
234.回文鏈表:找鏈表中點(diǎn)+鏈表反轉(zhuǎn)
61.旋轉(zhuǎn)鏈表:核心操作是找到鏈表的斷開點(diǎn)仁锯,重新組織兩段鏈表。輔助操作是招到第k%len個節(jié)點(diǎn)翔悠。
24.兩兩交換鏈表節(jié)點(diǎn):鏈表反轉(zhuǎn)的基本操作业崖。
25.K個一組進(jìn)行翻轉(zhuǎn):反轉(zhuǎn)列表II的迭代版,注意保存好反轉(zhuǎn)區(qū)間的前驅(qū)節(jié)點(diǎn)蓄愁。