1. 程式人生 > >連結串列經典面試題之從尾到頭列印單鏈表

連結串列經典面試題之從尾到頭列印單鏈表

題目:  要求將一無頭單鏈表的節點從尾到頭打印出來。這是一道經典的面試題,今天我們來介紹它的五種解決方法。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;
}
實驗結果: