劍指offer 鍊錶中倒數第k個結點

2021-08-26 15:14:23 字數 963 閱讀 1805

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

思路:定義兩個指標。第乙個指標從鍊錶的頭指標開始遍歷向前走k-1步,第二個指標保持不動;從第k步開始,第二個指標也開始從鍊錶的頭指標開始走,當第乙個指標走到尾結點是,第二個指標剛好走到倒數的第k個結點。

**:

listnode* findkthtotail(listnode* plisthead, unsigned

int k)

listnode* pahead = plisthead;

listnode* pbehind = null;

for (unsigned

int i = 0; i < k - 1; i++)

//鍊錶結點個數小於k

else

}pbehind = plisthead;

while (pahead->_next != null)

return pbehind;

}

對於這道題一定要注意三個地方:

1.輸入的plistnode為空指標。由於**會試圖訪問空指標指向的記憶體空間,程式崩潰

2.輸入的一plistnode為頭指標的鍊錶的結點個數的總數會小於k,由於在for迴圈中會在鍊錶上向前走k-1步,仍然會由於空指標造成程式崩潰

3.輸入的引數k為0。由於k是乙個無符號的整數,那麼在for迴圈中k-1得到的將不是-1,而是4294967295。因此for迴圈的執行次數遠遠超出我們的預計,也會造成程式崩潰

注意:寫**一定要注意**的魯棒性,如果寫出的**存在多處崩潰的風險,那寫出來的**就是「廝」

《劍指offer》 鍊錶中倒數第k個結點

題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點.這種考題是比較簡單的一種,以前也碰到過類似的題目,從耗時來說,一般都是使用兩個指標,一前一後的走,中間間隔k或者k 1個步長,這個視判斷語句而定。當前乙個指標走到末端時,後乙個指標正好落在倒數第k個節點處,直接返回該節點。code public c...

劍指offer 鍊錶中倒數第K個結點

輸入乙個鍊錶,輸出該鍊錶中倒數第k 個結點。從 1開始計數,即該鍊錶的尾節點是倒數第乙個結點。思路 一 鍊錶是單向鍊錶,只能從頭結點往後依次遍歷,倒數第k 個結點,也就是從頭結點開始的 n k 1 個結點。但是需要先遍歷一遍得到鍊錶長度,然後在找第 n k 1的k 結點。二 1 方法一需要對鍊錶進行...

劍指Offer 鍊錶中倒數第k個結點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。分析 兩個指標,先讓第乙個指標和第二個指標都指向頭結點,然後再讓第一指標走 k 1 步,即到達第k個結點。然後兩個指標同時開始向後移動,當第乙個指標到達最後的結點時候,第二個結點所在位置就是倒數第k個結點了。author zy date 2017年10月3日...