劍指 offer 之查詢倒數第 K 個結點

2021-09-02 11:33:07 字數 1261 閱讀 1233

題目描述:給定乙個單向鍊錶 list ,要你設計演算法找出倒數第 k 個結點並列印

struct listnode

;listnode* findkthtotail(listnode* phead);

首先我們分析題意:

1、首先我們能想到的是假如給定的是乙個雙向鍊錶就好了,我們可以從鍊錶的尾部向前遍歷找到倒數第 k 個結點,但是對於我們這道題顯然是行不通的

2、根據鍊錶的特性我們能想到的是,鍊錶節點數假設為 n ,要找倒數第 k 個結點,則我們只需從前往後遍歷鍊錶,走 (n - k + 1) 步就可以得到倒數第 k 個結點;至於鍊錶總結點數,我們可以遍歷鍊錶得出::為了實現只遍歷一次鍊錶就得到倒數第 k 個結點,我們可以定義兩個指標第乙個指標從頭節點遍歷走 (k - 1) 步,從第 k 步開始兩個指標同步向後遍歷,當快指標到達鍊錶的尾節點是,慢指標剛好是倒數第 k 個結點;基於這種思路我們可以寫出簡單的**;如下:

#include "slist.h"

/** struct listnode;*/

listnode* findkthtotail(listnode* phead, unsigned int k)

cout << pslow->m_value << endl;

return pslow;

}void findkthtotailtest()

int main()

執行結果:

解答這道題需注意的是:

1、輸入的鍊錶為空

2、鍊錶總結點數少於 k 或者鍊錶的總結點數 k== 0 

優化後的**為:

#include "slist.h"

/** struct listnode;*/

listnode* __findkthtotail(listnode* phead, unsigned int k)

else

}while(pfast->m_pnext != nullptr)

return pslow;

}void __findkthtotailtest()

int main()

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個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第1個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。結構體節點 struct listnode listnode f...

《劍指Offer》之鍊表中倒數第k個結點

題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。思路分析 由於是要找到倒數第k個結點,而鍊錶又不可以直接索引,因此,引入棧儲存各個鍊錶的結點,利用棧的反序功能,然後只需要返回第k個結點就可以了 本題中需注意 unsigned int 和int的轉換 k的值不能等於0或者大於鍊錶的總長度 鍊錶為空...