- 思路一:
初看題目测柠,最容易想到的方法就是遍歷卜录。首先遍歷一遍單鏈表昂验,得出整個鏈表的長度n(元素個數(shù)從1到n)捂敌,然后找到倒數(shù)第k個元素的位置n-k+1,接著從頭遍歷到第n-k+1元素凛篙,就是倒數(shù)第k個元素黍匾。但是該方法需要對鏈表進行兩次遍歷,遍歷的元素個數(shù)為n+n-k+1=2n+1-k個呛梆。
- 思路二:
有了思路一的提示锐涯,是不是可以想到用兩個指針,讓它們之間的距離保持為k-1填物,同時對鏈表進行遍歷纹腌,當?shù)谝粋€指針到達鏈表的最后一個元素(即倒數(shù)第一個元素時),第二個指針剛好停留在倒數(shù)第k個元素上滞磺。此方法看似對鏈表進行了一次遍歷升薯,其實是用兩個指針對鏈表進行了同時遍歷,對鏈表本身而言击困,它被遍歷的元素個數(shù)仍熱是n+n-k+1=2n+1-k個涎劈。
- 思路三:
思路一和思路二是兩種不同思路,但就本質(zhì)而言阅茶,都是兩次對鏈表進行2次遍歷蛛枚,一次遍歷n個元素,另一次遍歷n-k+1個脸哀,總共遍歷2n+1-k個元素蹦浦。此時,想想能否再減少遍歷的元素個數(shù)而找到倒數(shù)第k個元素呢撞蜂?我們注意到思路二盲镶,是用兩個指針,保持k-1個元素的距離同時進行遍歷的蝌诡,可否按著每次k個元素這樣的遍歷下去呢溉贿。這樣遍歷的結(jié)果就是,每次遍歷k個元素浦旱,遍歷m次(m=n/k)顽照,最后一次遍歷的個數(shù)為i個(i=n%k),我們只需記錄最后一次遍歷k個元素的起始位置,然后再遍歷i個元素代兵,此時的位置即為倒數(shù)第k個元素尼酿。此時,對鏈表遍歷的元素個數(shù)為n+i(i為n除以k的余數(shù))植影。
總結(jié):思路一和二的本質(zhì)雖相同裳擎,但是思路二卻是一種更高效的實現(xiàn),思路三屬于另一種額外思币,需要跳出保持k-1個距離的限制鹿响。比較下兩種遍歷中遍歷元素的個數(shù),在n固定的情況下谷饿,遍歷的元素個數(shù)取決于k惶我,即k的變動會引起遍歷個數(shù)的不同,而思路三中博投,真正決定遍歷個數(shù)的卻是i绸贡,即在i相同的情況下,即使k不同毅哗,遍歷的個數(shù)也有可能是相同的听怕。應(yīng)該值得注意的是,在n>k的情況的虑绵,n+i<2n+1-k尿瞭。
本次思路分析中并未考慮鏈表為空,和n<=k的情況翅睛,請在實現(xiàn)時声搁,加入此類條件判斷。