連結串列經典面試題之從尾到頭列印單鏈表
阿新 • • 發佈:2019-01-22
題目: 要求將一無頭單鏈表的節點從尾到頭打印出來。這是一道經典的面試題,今天我們來介紹它的五種解決方法。1 解決思路: 定義兩個指標,一個指向連結串列頭(pcur),一個指向每次要列印的節點(pprint)。每次讓pcur來遍歷,程式碼實現如下:
//從尾到頭列印單鏈表
void THprint2(PNode pHead){
if (NULL == pHead){
return;
}
PNode pcur = NULL;
PNode pprint = NULL;
while (pprint != pHead){
pcur = pHead;
while (pcur->_pNext != pprint){
pcur = pcur->_pNext;
}
printf("%d", pcur->_data);
pprint = pcur;
}
}
但這種方法每列印一個節點就要遍歷一次連結串列,時間複雜度為o(n^2);接受不了。2 解決思路; 遍歷一遍連結串列,將值存到數組裡,倒著打印出來(這裡就不實現了)。這種方法的時間複雜度為o(n),但空間複雜度為也為o(n)。3 解決思路: 藉助棧來實現,因為棧的特性為先進後出,所以可以遍歷一遍連結串列,將節點push進棧,然後在pop彈出,將實現逆序列印。4 可先將連結串列逆置過來,再遍歷一次連結串列將節點打印出來,最後將連結串列逆置回去。5 用遞迴的方法來實現(強力推薦此方法)易於理解且時間複雜度為o(n),空間複雜度也為o(n).看程式碼:測試用例://從尾到頭列印單鏈表 void THprint(PNode pHead){ if (NULL == pHead){ return; } THprint(pHead->_pNext); printf("%d->",pHead->_data); }
實驗結果:#define _CRT_SECURE_NO_WARNINGS #include "標頭.h" int main(){ PNode pHead; SListInit(&pHead); SListPushBack(&pHead, 1); SListPushBack(&pHead, 2); SListPushBack(&pHead, 3); SListPushBack(&pHead, 4); SListPushBack(&pHead, 5); SListPushBack(&pHead, 6); THprint(pHead); //THprint2(pHead); getchar(); return 0; }