題目:輸入乙個單向鍊錶,輸出該鍊錶中倒數第
k個結點。鍊錶的倒數第
0個結點為鍊錶的尾指標。
分析:為了得到倒數第
k個結點,很自然的想法是先走到鍊錶的尾端,再從尾端回溯
k步。可是輸入的是單向鍊錶,只有從前往後的指標而沒有從後往前的指標。因此我們需要開啟我們的思路。
既然不能從尾結點開始遍歷這個鍊錶,我們還是把思路回到頭結點上來。假設整個鍊錶有
n個結點,那麼倒數第
k個結點是從頭結點開始的第
n-k-1
個結點(從
0開始計數)。如果我們能夠得到鍊錶中結點的個數
n,那我們只要從頭結點開始往後走
n-k-1
步就可以了。如何得到結點數
n?這個不難,只需要從頭開始遍歷鍊錶,每經過乙個結點,計數器加一就行了。
這種思路的時間複雜度是
o(n)
,但需要遍歷鍊錶兩次。第一次得到鍊錶中結點個數
n,第二次得到從頭結點開始的第
n-k-1
個結點即倒數第
k個結點。
如 果鍊錶的結點數不多,這是一種很好的方法。但如果輸入的鍊錶的結點個數很多,有可能不能一次性把整個鍊錶都從硬碟讀入物理記憶體,那麼遍歷兩遍意味著乙個結 點需要兩次從硬碟讀入到物理記憶體。我們知道把資料從硬碟讀入到記憶體是非常耗時間的操作。我們能不能把鍊錶遍歷的次數減少到
1?如果可以,將能有效地提高**執行的時間效率。
如果我們在遍歷時維持兩個指標,第乙個指標從鍊錶的頭指標開始遍歷,在第
k-1步之前,第二個指標保持不動;在第
k-1步開始,第二個指標也開始從鍊錶的頭指標開始遍歷。由於兩個指標的距離保持在
k-1,當第乙個(走在前面的)指標到達鍊錶的尾結點時,第二個指標(走在後面的)指標正好是倒數第
k個結點。
這種思路只需要遍歷鍊錶一次。對於很長的鍊錶,只需要把每個結點從硬碟匯入到記憶體一次。因此這一方法的時間效率前面的方法要高。
查詢鍊錶中倒數第k個節點
問題 輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。為了符合大多數人的習慣,從1開始計數,即鍊錶的尾節點是倒數第1個節點。例如,乙個鍊錶有6個節點,從頭節點開始,它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個節點是值為4的節點,鍊錶節點定義如下 struct listnode 解題思路 由於...
查詢鍊錶中倒數第k個節點
1.題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾節點是倒數第1個節點。例如,乙個鍊錶有6個節點,從頭節點開始,它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個節點是值為4的節點。示例 給定乙個鍊錶 1 2 3 4 5,和 k 2....
鍊錶中倒數第k個節點
題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。struct listnode方法 定義兩個指標。第乙個指標從鍊錶的頭指標開始遍歷向前走k 1,第二個指標保持不動 從第k步開始,第二個指標也開始從鍊錶的頭指標開始遍歷。由於兩個指標的距離保持在k 1,當第乙個 走在前面的 指標到達鍊錶的尾結點時,第二...