劍指offer 面試題15 鍊錶中倒數第K個結點

2021-07-10 19:42:49 字數 788 閱讀 8291

題目:輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第乙個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1、2、3、4、5、6.這個鍊錶的倒數第三個結點是值為4的結點。

思路:這個題目我自己也實現了一遍,採用的方法是從頭開始遍歷鍊錶,同時每次判斷當前結點的後面第k-1個結點。如果後面的結點為null,則說明鍊錶長度小於k,返回錯誤。如果不為空且尾結點不為空,那麼往後遍歷直到到達為結點,前面的那個結點即為要求的倒數第k個結點。但是這種方法每次都要求尋找後面第k-1個結點,比較麻煩。劍指offer這本書上提出了利用前後兩個指標的方法,乙個指標先從鍊錶的頭結點往後走k-1步,然後第二個指標指向表頭,同時向鍊錶後面移動,保持兩個指標之間k-1個結點的距離,第乙個指標指向尾結點的時候前面的指標即為倒數第k個結點,時間複雜度為o(n),注意鍊錶為空和鍊錶長度小於k的情況。

listnode* findkthtotail(listnode* plisthead, int k)

listnode* pahead = plisthead;

for(int i = 0; i < k - 1; ++i) }

listnode* pbehind = plisthead;

while(pahead->m_pnext != null)

return pbehind;

}

舉一反三:當我們用乙個指標遍歷鍊錶不能解決問題的時候,可以嘗試用兩個指標來遍歷鍊錶,可以讓其中乙個指標遍歷的速度快一些(比如一次在鍊錶上走兩步),或者讓它先在鍊錶上走若干步。

劍指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節點。因此調整時 需要知道當前節點以及當前節點前面乙個節點,以及當前節點後面乙個...