題目:輸入乙個鍊錶,輸出該鍊錶中倒數第k 個結點.為了符合大多數人的習慣,本題從 1 開始計數,即鍊錶的尾結點是倒數第 1 個結點.例如乙個鍊錶有 6 個結點,從頭結點開始它們的值依次是 1 、2、3、4、5 、6。這個個鍊錶的倒數第 3 個結點是值為 4 的結點。
剛好以前看到類似的題目,所以可以很快想到要用兩個指標遍歷。第乙個指標從煉表頭指標開始遍歷向前走k-1,第二個指標保持不變;由於兩個指標距離保持k-1,當第乙個指標到達鍊錶尾結點時,第二個指標正好在倒數第k個結點。
思路想清楚了,這裡的測試用例要仔細考慮
功能測試(第k個結點在鍊錶中間、頭結點、尾結點)
特殊輸入測試(煉表頭結點為null,指標結點總數少於k,k等於0)
其實此題目的關鍵是魯棒性,消除崩潰的潛在風險。
比如說,假如輸入的引數k為0,因為沒有倒數第0個結點的說法,並且k是乙個無符號引數,在for迴圈中k-1不是-1而是4294967295,所以迴圈次數會變得特別大,也會造成程式崩潰;假如頭結點是空指標,**試圖訪問空指標指向記憶體,也會崩潰;假如指標結點總數少於你指定的k,也會程式崩潰。
所以**最後呈現為:
public class findkthtotail
private static class listnode
/***
* @param head 鍊錶的頭結點
* @param k 倒數第k個結點
* @return 倒數第k個結點listnode
*/private static listnode findkthtotail(listnode head,int k)
//指向頭結點的
listnode pointer=head;
for(int i=0
;iif(pointer.next!=null)
else
}listnode p2=head;
while(pointer.next!=null)
return p2;
}}
結果:
9 5
1 null
劍指offer學習心得 之 反轉鍊錶
題目 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。在單鏈表的表頭臨時接入乙個節點,然後進行尾插法操作。反轉單鏈表。最好就是提前想好測試用例,寫出 以後再用事先準備好的測試用例進行檢查測試。功能測試 輸入的鍊錶含有多個結點 只有乙個結點 特殊輸入測試 煉表頭結點為null ...
《劍指offer 之鍊錶題目
這幾天在看 劍指offer 寫的很好,跟july的各有千秋,更加注重歸納總結,筆試面試臨時抱佛腳,決定要啃下這其中的46道題目。ok,把每道題目自己實現,相同的歸成一類。這次把所有的與list相關的題目列出來。思路 從尾到頭列印list的話,考慮用stack先把各節點儲存起來,遍歷完以後再將stac...
劍指offer之反轉鍊錶
題目介紹 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。題目比較簡短,所以直接上 public class listnode public class solution listnode curnode head.next head.next null listnode resultnode hea...