題目描述:
輸入一個鏈表,輸出該鏈表中倒數第k個結點。為了符合習慣,從1開始計數,即鏈表的尾結點是倒數第1個節點。例如,一個鏈表有6個結點,從頭結點開始,它們的值依次是1,2,3,4,5,6。則這個鏈表倒數第三個結點是值為4的結點。
解題思路:
對於單鏈表來說,沒有從后向前的指針,因此一個直觀的解法是先進行一次遍歷,統計出鏈表中結點的個數n,第二次再進行一次遍歷,找到第n-k+1個結點就是我們要找的結點,但是這需要對鏈表進行兩次遍歷。
為了實現一次遍歷,我們這里采用雙指針解法。我們可以定義兩個指針,第一個指針從鏈表的頭指針開始先向前走k步,第二個指針保持不動,從第k+1步開始,第二個指針也從頭開始前進,兩個指針都每次前進一步。這樣,兩個指針的距離都一直保持在k,當快指針(走在前面的)到達null時,慢指針(走在后面的)正好到達第k個結點。注意:要時刻留意空指針的判斷。
舉例:

編程實現(Java):
public ListNode FindKthToTail(ListNode head,int k) {
if(head==null)
return null;
//思路:快慢指針,快指針先走k步,慢指針從頭開始,都向前進,快指針到null時,前一個正好是倒數第k個
ListNode fast=head,slow=head;
for(int i=0;i<k;i++){ //快指針先走k步
if(fast!=null)
fast=fast.next;
else
return null;
}
while(fast!=null){
fast=fast.next;
slow=slow.next;
}
return slow;
}