面試中經常出現的程式設計題之一。
最直接的辦法是先遍歷一遍單鏈表,記下鍊錶的節點數,然後再次遍歷,直到到達節點數減去n的節點,返回結果。實際情況中若鍊錶數目很多而n相對不大,這種方法需要大約兩次遍歷。更簡單的實現方法是採用雙指標。乙個指標先從煉表頭開始步進n步,然後另乙個指標從頭開始,兩個指標一同步進直到達到鍊錶尾。這是第二個指標所指的節點即為鍊錶的倒是第n個節點。實現**如下:
struct node * lastn(struct node * head, int n)
q = head;
while(--n)
q = q->next;
} p = head;
while(q->next)
return p;
}
需要注意一些特殊情況的檢查:
1.n大於節點數目
2.引數n為0或者負數
3.引數head為空指標
雙鏈表方法可以實現很多問題的解答,還有乙個例子是求單鏈表是否有環。這時可以使用兩個鍊錶,乙個步進一步,乙個步進兩部,如果有環兩煉表就會相遇。
摘自:
筆試or面試 尋找單鏈表倒數第n個元素
在各種面試筆試中,單鏈表考察的最多。其中有一道經典的題目 尋找單鏈表倒數第n個元素 如果僅僅是這麼問,大多數人想到這不是很簡單麼 先遍歷整個鍊錶獲知整個鍊錶長度l,然後再l n 1個節點就是所求節點。但很顯然面試官不滿足於這種問題,而是 一次遍歷尋找單鏈表倒數第n個元素 這樣的話,該如何找到思路呢?...
刪除單鏈表倒數第n個節點
如何刪除單鏈表中的倒數第n個節點?先遍歷一遍單鏈表,計算出單鏈表的長度,然後,從單鏈表頭部刪除指定的節點。description 刪除單鏈表倒數第n個節點,常規解法.param head param n return listnode public static listnode removenth...
尋找單鏈表中倒數第k個結點
題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第1個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1,2,3,4,5,6.這個鍊錶的倒數第3個結點是值為4的結點。思路分析 為了得到倒數第k個結點,很自然的想法是先走到鍊錶的...