題目:
輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點,為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第1個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1、2、3、4、5、6。這個鍊錶的倒數第3個結點的值為4的節點。
鍊錶結點的定義如下:
public class listnode
}
示意圖:
分析:
為了得到倒數第k個結點,很自然的想法是先走到鍊錶的尾端,再從尾端回溯k步。可是我們從鍊錶結點的定義可以看出本題中的鍊錶是單向鍊錶,單向鍊錶的節點只有從前往後的指標而沒有從後往前的指標,因此這個思路不通
既然不能從尾結點開始遍歷這個鍊錶,我們還是把思路回到從頭結點上來。假設整個鍊錶有n個結點,那麼倒數第k個結點就是從頭結點開始的第n-k+1個結點。如果我們能夠得到鍊錶中節點的個數n,那我們只要從頭結點開始往後走n-k+1步就可以了,如何得到節點數n?這個不難,只需要從頭開始遍歷鍊錶,每經過乙個結點,計數器加1就行了。也就是說我們需要遍歷鍊錶兩次,第一次統計出煉表中結點的個數,第二次就能找到倒數第k個結點。
但是以上思路需要遍歷兩次鍊錶,有沒有只需要遍歷一次鍊錶的演算法呢?為了實現只遍歷一次鍊錶就能找到倒數第k個結點,我們可以定義兩個指標,如上面示意圖所示。第乙個指標從鍊錶的頭指標開始遍歷向前走k-1步,第二個指標保持不動;從第k步開始,第二個指標也開始從鍊錶的頭指標開始遍歷。由於兩個指標的距離保持在k-1,當第乙個指標到達鍊錶的尾節點時,第二個指標正好是倒數第k個結點。
注意:
(1)輸入的頭結點head為空時
(2)輸入的以head為頭結點的鍊錶的結點總數少於k
(3)輸入的引數k為0時
劍指offer面試題15
面試題15 鍊錶中倒數第k個結點 題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第乙個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。預備知識 鍊錶結點的定義如下 ...
劍指offer 面試題16 反轉鍊錶
題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。hint 請務必使用鍊錶 輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 0 n 1000 代表將要輸入的鍊錶的個數。輸入的第二行包含n個整數t 0 t 1000000 代表鍊錶元素。輸出 對應每個...
劍指Offer面試題16 反轉鍊錶
反轉鍊錶 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出翻轉後鍊錶的頭結點。分析 假設h,i,j三個節點。h節點已經指向前面的節點,i節點要指向h節點,這時,i與j中間斷開,因此在將i節點指向 h節點之前,先記下j節點。因此調整時 需要知道當前節點以及當前節點前面乙個節點,以及當前節點後面乙個...