題目:輸入一個鏈表的頭結點,從尾到頭反過來打印出每個結點的值。
鏈表結點定義如下:
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); } }