設計算法,從一個單鏈表中找到倒數第n個元素。
思路:
由於是單鏈表,我們只能從個前面遍歷。我們可以有以下三種思路:
1、先遍歷整個鏈表,求得鏈表的長度len,而後再從頭遍歷,找到地len-n(假設鏈表的首節點為第一個節點)個節點,即為導數第n個節點,這樣時間復雜度為O(n),需要遍歷的操作len + len-n = 2len-n次。
2、考慮將鏈表從第一個節點開始依次壓棧,這樣出棧的時候,第n個出棧的元素即為鏈表中的第n個節點,這樣的時間復雜度依然為O(n),需要遍歷的操作為len+n,需要額外的輔助空間,空間復雜度為O(n)。
3、可以設置兩個指針p1和p2,開始時均指向頭結點,而後將指針p2移動n個位置,這樣兩個指針就相差n個節點的距離,而後同時移動兩個指針,當p2移動到鏈尾時,p1便指向了倒數第n個節點。這樣的時間復雜度與需要遍歷的操作次數均和第1種情況相同。
下面的程序中我們采用第三中實現方法。
實現代碼:
/* 找到單鏈表中倒數第n個元素 */ PNODE FindNthToLast(PNODE pHead,int n) { if(!pHead || n<1) return NULL; PNODE p1 = pHead; PNODE p2 = pHead; while(p2 && n>0) { p2 = p2->pNext; n--; } if(n>0) return NULL; while(p2) { p1 = p1->pNext; p2 = p2->pNext; } return p1; }單鏈表的實現代碼與Q2.1中相同,用的以前寫的單鏈表的代碼,這裡不再貼出。
測試結果: