演算法 查詢鍊錶中倒數第k個節點

2021-08-14 00:15:50 字數 1327 閱讀 8725

題目:輸入乙個單向鍊錶,輸出該鍊錶中倒數第

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,當第乙個 走在前面的 指標到達鍊錶的尾結點時,第二...