劍指Offer(鍊錶的倒數第k個數值)

2021-08-20 23:43:24 字數 1333 閱讀 5544

正常的思維都是先遍歷一遍鍊錶得到鍊錶的長度,然後通過鍊錶的長度減去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 方法一需要對鍊錶進行...