面試題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,...