從尾到頭打印鏈表


 

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

鏈表結點定義如下:

struct ListNode
{
    int  m_nKey;
    ListNode *m_pNext;
};

解決這個問題肯定要遍歷鏈表。遍歷的順序是從頭到尾的順序,可輸出的順序卻是從尾到頭。也就是說第一個遍歷到的結點最后一個輸出,而最后一個遍歷到得結點第一個輸出。這就是典型的“后進先出”,可以用實現這種順序。每經過一個結點的時候,把該結點放到一個棧中。當遍歷完整個鏈表后,再從棧頂開始逐個輸出結點的值,此時輸出的結點的順序已經反轉過來了。

實現代碼如下:

void PrintListReverse(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_nValue);
		nodes.pop();
	}
}

 

遞歸在本質上就是一個棧結構,於是很自然地想到用遞歸來實現。要實現反過來輸出鏈表,每訪問到一個結點的時候,先遞歸輸出它后面的結點,再輸出該結點自身,這樣鏈表的輸出結構就反過來了。

實現代碼如下:

void PrintListReversely(ListNode* pListHead)
{
      if(pListHead != NULL)
      {
            // Print the next node first
            if (pListHead->m_pNext != NULL)
            {
                  PrintListReversely(pListHead->m_pNext);
            }

            // Print this node
            printf("%d", pListHead->m_nKey);
      }
}

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM