面試中經常出現的編程題之一。
最直接的辦法是先遍歷一遍單鏈表,記下鏈表的節點數,然後再次遍歷,直到到達節點數減去n的節點,返回結果。實際情況中若鏈表數目很多而n相對不大,這種方法需要大約兩次遍歷。更簡單的實現方法是採用雙指針。一個指針先從鏈表頭開始步進n步,然後另一個指針從頭開始,兩個指針一同步進直到達到鏈表尾。這是第二個指針所指的節點即爲鏈表的倒是第n個節點。實現代碼如下:
struct node * lastn(struct node * head, int n){
struct node *p, *q;
if(n < 1){
return NULL;
}
q = head;
while(--n){
if(!q->next){
return NULL;
}
q = q->next;
}
p = head;
while(q->next){
p = p->next;
q = q->next;
}
return p;
}
需要注意一些特殊情況的檢查:
1.n大於節點數目
2.參數n爲0或者負數
3.參數head爲空指針
雙鏈表方法可以實現很多問題的解答,還有一個例子是求單鏈表是否有環。這時可以使用兩個鏈表,一個步進一步,一個步進兩部,如果有環兩鏈表就會相遇。
摘自:http://blog.csdn.net/ruizeng88/article/details/6700727