題目:輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾節點是倒數第1個節點。例如,乙個鍊錶有6個節點,從頭節點開始,它們的值依次是1、2、3、4、5、6。這個鍊錶的倒數第3個節點是值為4的節點。
第一種實現: 遍歷放在列表中,但是會增加空間複雜度
# -*- coding:utf-8 -*-
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
:def
findkthtotail
(self, head, k)
:# write code here
l =while head !=
none
: head = head.
next
if k >
len(l)
or k <1:
return
return l[
-k]
分析:為了得到倒數第k個節點,很自然的想法是先走到鍊錶的尾端,再從尾端回溯k步。可是我們從鍊錶節點的定義可以看出,本題中的鍊錶是單向鍊錶,單向鍊錶的節點只有從前往後的指標而沒有從後往前的指標,因此這種思路行不通。
既然不能從尾節點開始遍歷這個鍊錶,我們還是把思路回到頭節點上來。假設整個鍊錶有n個節點,那麼倒數第k個節點就是從頭節點開始的第n-k+1個節點。如果我們能夠得到鍊錶中節點的個數n,那麼只要從頭節點開始往後走n-k+1步就可以了。如何得到節點數n?這個不難,只需要從頭開始遍歷鍊錶,每經過乙個節點,計數器加1就行了。
也就是說我們需要遍歷鍊錶兩次,第一次統計出煉表中節點的個數,第二次就能找到倒數第k個節點。但是當我們把這種思路解釋給面試官之後,他會告訴我們他期待的解法只需要遍歷鍊錶一次。
為了實現只遍歷鍊錶一次就能找到倒數第k個節點,我們可以定義兩個指標。第乙個指標從鍊錶的頭指標開始遍歷向前走k-1步,第二個指標保持不動;從第k步開始,第二個指標也開始從鍊錶的頭指標開始遍歷。
由於兩個指標的距離保持在k-1,當第乙個(走在前面的)指標到達鍊錶的尾節點時,第二個(走在後面的)指標正好指向倒數第k個節點。
下面以在有6個節點的鍊錶中找倒數第3個節點為例分析這種思路的過程。首先用第乙個指標從頭節點開始向前走兩(2=3-1)步到達第3個節點,如圖3.7(a)所示。接著把第二個指標初始化指向鍊錶的第乙個節點,如圖3.7(b)所示。最後讓兩個指標同時向前遍歷,當第乙個指標到達鍊錶的尾節點時,第二個指標指向的剛好就是倒數第3個節點,如圖3.7(c)所示。
《劍指offer》面試題22 鍊錶中倒數第k個節點
鍊錶節點定義如下 struct listnode 思路 定義兩個指標,第乙個指標先指向第k個節點,既向前走k 1步,然後另第二個指標指向頭結點,然後兩個指標一起向後移動,直到第乙個指標走到最後乙個節點時,此時第二個指標正好指向倒數第k個節點。注意 1.要判斷輸入是否為空指標,若為空指標,試圖訪問空指...
劍指offer 面試題 22 鍊錶中倒數第K個節點
輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。注意 樣例 輸入 鍊錶 1 2 3 4 5 k 2 輸出 4先判斷 k 的合法性,如果 k 0,則返回null。求出鍊錶的長度。再判斷k是否大於鍊錶的長度。如果大於,則返回null,否則繼續。從頭開始遍歷 len k 個節點,則下乙個節點,也就是第 len ...
劍指offer 面試題22 鍊錶中倒數第k個節點
輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。第一次遍歷鍊錶,計算鍊錶長度length 第二次遍歷鍊錶,讓指標向後移動length k次,就可以得到倒數第k個結點。鍊錶結點的資料結構 public class listnode public class solution listnode p head,...