劍指Offer 面試題22 鍊錶中倒數第k個結點

2021-10-02 23:58:22 字數 1804 閱讀 1398

面試題22:鍊錶中倒數第k個結點

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

* 方法一:遍歷鍊錶兩次, 第一次統計出鍊錶結點的個數, 第二次就能找到倒數第k個結點

* 缺點:需要遍歷鍊錶兩次

**/listnode*

findkthtotail1

(listnode* plisthead,

unsigned

int k)

listnode* pnode=plisthead;

int lengthoflist=0;

while

(pnode)

if(lengthoflist

return

null

; pnode=plisthead;

int cnt=0;

while

(cnt!=lengthoflist-k+1)

return pnode;

}/**

* 方法二:利用兩個指標, 第乙個指標從鍊錶的頭指標開始遍歷向前走 k-1 步,第二個指標保持不動,

* 再兩個指標同時移動, 直到第乙個指標到鍊錶末尾, 第二個指標指向的元素即為所求元素

**/listnode*

findkthtotail2

(listnode* plisthead,

unsigned

int k)

listnode* p1=plisthead;

listnode* p2=

null

;for

(unsigned

int i=

0;i1;i++

) p2=plisthead;

while

(p1-

>next!=

null

)return p2;

}int

main()

求鍊錶的中間節點。如果鍊錶中的節點總數為奇數,則返回中間節點;如果節點總數是偶數,則返回中間兩個節點的任意乙個。為了解決這個問題,我們也可以定義兩個指標,同時從鍊錶的頭節點出發,乙個指標一次走一步,另乙個指標一次走兩步。當走得快的指標走到鍊錶的末尾時,走得慢的指標正好在鍊錶的中間。

#include

#include

#include

#include

using

namespace std;

struct listnode

;listnode*

findmidoflist

(listnode* plisthead)

listnode* p1=plisthead;

listnode* p2=plisthead;

while

(p2-

>next!=

null

)return p1;

}int

main()

《劍指offer》面試題22 鍊錶中倒數第k個節點

鍊錶節點定義如下 struct listnode 思路 定義兩個指標,第乙個指標先指向第k個節點,既向前走k 1步,然後另第二個指標指向頭結點,然後兩個指標一起向後移動,直到第乙個指標走到最後乙個節點時,此時第二個指標正好指向倒數第k個節點。注意 1.要判斷輸入是否為空指標,若為空指標,試圖訪問空指...

劍指offer 面試題 22 鍊錶中倒數第K個節點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。注意 樣例 輸入 鍊錶 1 2 3 4 5 k 2 輸出 4先判斷 k 的合法性,如果 k 0,則返回null。求出鍊錶的長度。再判斷k是否大於鍊錶的長度。如果大於,則返回null,否則繼續。從頭開始遍歷 len k 個節點,則下乙個節點,也就是第 len ...

劍指offer 面試題22 鍊錶中倒數第k個節點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。第一次遍歷鍊錶,計算鍊錶長度length 第二次遍歷鍊錶,讓指標向後移動length k次,就可以得到倒數第k個結點。鍊錶結點的資料結構 public class listnode public class solution listnode p head,...