題目描述:給定乙個單向鍊錶 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或者大於鍊錶的總長度 鍊錶為空...