演算法的分析過程均在**注釋中:
/*** 題目:輸入乙個單鏈表,輸出該鍊錶從後往前的第k個數。
* ps:從後往前數時從1開始計數。
* @author 柴毛毛大閒人 */
public
class
tailk {
/**
* 分析:要尋找倒數第k個數,很自然想到的方法是:從末尾向前找第k個數。
* 然而這種方法面臨兩個問題:1.我們無法直到單鏈表的末尾在哪兒,2.我們無法從後向前遍歷單鏈表。
* 為了解決上述兩個問題,我們首先想到的方法是:遍歷兩次單鏈表,第一次求得單鏈表的長度n,第二次遍歷到第n-k個元素停止即可。
* **如下: */
//使用全域性變數result表示函式執行結果
static
boolean result = true;
/**
* @param first 單鏈表的首結點
* @param k 要找的倒數第幾個元素
* @return 返回倒數第k個值 */
public
static
intgettailk(nodefirst,int k){
//若煉表為空
if(first==null){
system.out.println("鍊錶為空!");
result = false;
return
0;//若k<=0
if(k<1){
system.out.println("k不能小於1!");
result = false;
return
0;//計算鍊錶長度
int length = 1;
nodep = first;
while(p.next!=null){
length++;
p = p.next;
//若k比鍊錶還長
if(lengthsystem.out.println("k="+k+"超過了鍊錶長度!");
result = false;
return
0;//遍歷鍊錶,遍歷到第n-k個元素結束
nodeq = first;
for(int i=0;iq = q.next;
return q.data;
/**
* 上述方法能解決問題,但需要遍歷鍊錶兩次,能否有更高效的辦法?
* 可以使用兩個指標i和j,指標i從頭開始先走k步,然後j指向第乙個結點,接下來保持i和j之間的距離,當j走到尾時,i指向的結點就是倒數第k個結點。
* **如下: */
public
static
intgettailk_modify(nodefirst,int k){
//若煉表為空
if(first==null){
system.out.println("鍊錶為空!");
result = false;
return
0;//若k<=0
if(k<1){
system.out.println("k不能小於1!");
result = false;
return
0;//定義兩個指標p和q,p指向頭結點,q指向第k個結點
nodep = first;
nodeq = first;
//將q指向第k個結點
for(int i=0;i1;i++){
//若q還沒指向第k個結點,但q已經是最後乙個結點,則說明k超過了鍊錶長度
if(q.next==null){
system.out.println("k="+k+"超過了鍊錶長度!");
result = false;
return
0;q = q.next;
//p和q分別向後移動,直到q走到鍊錶末尾為止
while(q.next!=null){
p = p.next;
q = q.next;
return p.data;
/**
* 測試 */
public
static
void
main(string args){
nodenode1 = new node();
nodenode2 = new node();
nodenode3 = new node();
nodenode4 = new node();
node1.data = 1;
node2.data = 2;
node3.data = 3;
node4.data = 4;
node1.next = node2;
node2.next = node3;
node3.next = node4;
system.out.println(gettailk_modify(node1,11));
/**
* 定義結點 */
class
node
{public t data;
public nodenext;
面試題15 鍊錶中倒數第k個節點
題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。從1開始計數,如鍊表有1,2,3,4,5,6.倒數第三個節點是值為4的節點。可以採用兩個指標,思路比較清晰,但是就是一些邊界條件很難考慮全,比如k超出了鍊錶的長度。struct listnode class solution if fast null ...
面試題15 鍊錶中倒數第K個節點
鍊錶的定義如下 struct listnode 有三種方法 遞迴法,自定義棧法和前後指標法。如下 listnode findkthtotail listnode head,int k else if k 1 else if k 1 k listnode findkthtotail listnode ...
面試題15 鍊錶中倒數第K個結點
題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第1個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。鍊錶的節點定義如下,這裡使用的是c 來定義 public cla...