面試題5:從尾到頭打印鏈表的c++代碼實現

題目:輸入一個鏈表的頭結點,從尾到頭反過來打印出每個結點的值。

鏈表結點的定義如下:

struct ListNode
{
	int        m_nKey;
	ListNode   m_pNext;
};


思路分析:解決這個問題要遍歷鏈表。鏈表的順序是從頭到尾的順序,輸出的順序是從尾到頭,是典型的後進先出,可以用棧來實現這種順序。

c++代碼實現:

void PrintListReversingly_Iteratively(ListNode* pHead)
{
	std::stack<ListNode*> nodes;
	
	ListNode* pNode = pHead;
	while(pNode!=NULL)
	{
		nodes.push(pNode);
		pNode=pNode->m_pNext;
	}
	
	//當遍歷完整個鏈表之後,再從棧頂開始逐個輸出結點的值
	while(!nodes.empty())
	{
		pNode=nodes.top();
		printf("%d\t",pNode->m_nKey);
		nodes.pop();
	}
}
用棧來實現這個函數,而遞歸在本質上就是一個棧結構,考慮用遞歸實現。

要實現反過來輸出鏈表,當每訪問到一個結點的時候,先遞歸輸出它後面的結點,再輸出該結點自身,這樣鏈表的輸出結果就反過來了。

void PrintListReversingly_Recursively(ListNode* pHead)
{
	if(pHead!=Null)
	{
		if(pHead->m_pNext!=Null)
		{
			PrintListReversingly_Recursively(pHead->m_pNext);
		}
		printf("%d\t",pHead->m_nKey);
	}
}


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