【經典面試題】尋找單鏈表倒數第n個節點_C/C++

面試中經常出現的編程題之一。

最直接的辦法是先遍歷一遍單鏈表,記下鏈表的節點數,然後再次遍歷,直到到達節點數減去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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章