正常的思維都是先遍歷一遍鍊錶得到鍊錶的長度,然後通過鍊錶的長度減去k得到正數第幾個值。
因此我們先用簡單的方法解決一下:
首先需要我們構建乙個鍊錶:我們使用尾插法進行新的節點的加入,因此我們需要建立兩個節點,乙個節點負責新資料的構建,乙個負責鍊錶的記錄。
struct listnode
;
首先我們需要構建乙個結構體,也就是乙個鍊錶的乙個節點。
然後我們來建立鍊錶:
listnode *l;
listnode *r,*p;
l=new listnode;
l->val=0;
r=l;
for (int i=1;i<10;i++)
r->next=null;
這裡我們來解釋一下鍊錶的建立的過程:l作為乙個整個鍊錶,我們肯定需要首先建立,然後就是節點r和p了,其中r是負責記錄鍊錶的走勢的,p是新節點。因此我們需要現將r指向鍊錶一開始的l,當然這個時候l肯定為空了。
後面的關鍵在於r的下乙個需要指向新節點p,然後r轉移到當前的p的位置,接著再指向下乙個p,接著又轉移到下乙個p,如此反覆的進行,知道最後我們需要在最後加上r->next=null來表示鍊錶的結束。
好了,鍊錶建立完畢後,我們首先通過兩次遍歷的方法來實現一次:
class solution
if(countnext;
return p;}};
其基本思路是:先遍歷真個鍊錶得到鍊錶的長度count,然後判斷count和k的大小,如果小於k,那就說明k的取值越界了。之後只要移動count-k位就行了。
其實還有一種只遍歷一次的方法:使用兩個節點,乙個讀取k-1步,然後第二個再開始讀取,這個時候兩個節點同時移動,當第乙個節點移動到鍊錶的結尾時,第二個節點的位置就是倒數第k個節點的位置。
這裡我們需要注意的是為什麼要先走到k-1步,我們可以假設鍊錶的長度為n,那麼第乙個節點走到k-1的位置時,第二個節點開始移動,那麼第二個節點移動的長度便是n-k+1。我們可以用乙個例子來解釋一下,加入鍊錶為,k=3,n=9,第乙個節點需要先走2步到達2,然後第二個節點和第乙個節點一起同時走,需要走7步,第乙個節點到達鍊錶的尾部9,第二個節點到達鍊錶的第7位,即為7。
實現**:
class solution
while(r->next!=null)
return p;
}};
執行結果:
python劍指offer 鍊錶倒數第k個結點
題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。思想 利用兩個指標,第乙個指標f到達k之後,新建乙個指標sencond,遍歷最後乙個時sencond則為倒數第k個結點 coding utf 8 class listnode def init self,x self.val x self.next n...
《劍指offer》 鍊錶中倒數第k個結點
題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點.這種考題是比較簡單的一種,以前也碰到過類似的題目,從耗時來說,一般都是使用兩個指標,一前一後的走,中間間隔k或者k 1個步長,這個視判斷語句而定。當前乙個指標走到末端時,後乙個指標正好落在倒數第k個節點處,直接返回該節點。code public c...
劍指offer 鍊錶中倒數第K個結點
輸入乙個鍊錶,輸出該鍊錶中倒數第k 個結點。從 1開始計數,即該鍊錶的尾節點是倒數第乙個結點。思路 一 鍊錶是單向鍊錶,只能從頭結點往後依次遍歷,倒數第k 個結點,也就是從頭結點開始的 n k 1 個結點。但是需要先遍歷一遍得到鍊錶長度,然後在找第 n k 1的k 結點。二 1 方法一需要對鍊錶進行...