C++從尾到頭列印連結串列(劍指offer面試題6)
阿新 • • 發佈:2019-01-08
下面是PrintListInReversedOrder.h檔案,利用兩種方法
// 面試題6:從尾到頭列印連結串列
// 題目:輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值。
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
//單項鍊表的結點定義
struct ListNode
{
int m_nValue;
ListNode *m_pNext;
};
/********************************************************/
//假設要求上述題目不能改變連結串列的結構
//解決上述問題肯定要遍歷連結串列,遍歷的順序是從頭到尾,可輸出的順序卻是從尾到頭。
//也就是說,第一個遍歷到的節點最後一個輸出,而最後一個遍歷到的節點第一個輸出。
//這就是典型的“後進先出”,我們可以用棧實現這種順序。每經過一個節點的時候,
//把該節點放到一個棧中。當遍歷完整個連結串列後,再從棧頂開始逐個輸出節點的值,此時
//輸出的節點的順序已經反轉過來,實現程式碼如下:
/********************************************************/
void PrintListReversingly_Iteratively(ListNode* pHead)
{
stack<ListNode*>nodes;
ListNode* pNode = pHead;
while (pNode != nullptr)
{
nodes.push(pNode);
pNode = pNode->m_pNext;
}
while (!nodes.empty())
{
pNode = nodes.top();
cout << pNode->m_nValue << " ";
nodes.pop();
}
cout << endl;
}
/**************************************************************/
//既然想到了用棧來實現這個函式,而遞迴本質上就是一個棧結構,於是
//很自然想到用遞迴來實現。要實現反過來輸出連結串列,我們每訪問到一個
//節點的時候,先遞迴輸出它後面的節點,再輸出該節點自身,這樣連結串列
//的輸出結果就反過來了。
/**************************************************************/
void PrintListReversingly_Recursively(ListNode* pHead)
{
if (pHead != nullptr)
{
if (pHead->m_pNext != nullptr)
{
PrintListReversingly_Recursively(pHead->m_pNext);
}
/*printf("%d\t", pHead->m_nValue);*/
cout << pHead->m_nValue << " ";
}
}
下面是PrintListInReversedOrder.cpp檔案,包含主函式
#include<iostream>
#include<list>
#include"PrintListInReversedOrder.h"
using namespace std;
int main()
{
ListNode* pHead = new ListNode();
ListNode *pNew, *pTemp;
pTemp = pHead;
int a[5] = { 1, 4, 2, 5, 6 };
for (int i = 0; i < 5; i++)
{
pNew = new ListNode;
pNew->m_nValue = a[i];
pNew->m_pNext = NULL;
pTemp->m_pNext = pNew;
pTemp = pNew;
}
//以上程式段是利用陣列生成一個連結串列,生成的連結串列pHead為{0, 1, 4, 2, 5, 6},可以看出多了初始頭結點0
ListNode *temp = pHead->m_pNext;//去掉初始頭結點
cout << "利用棧方法從尾到頭反過來列印連結串列的值如下:" << endl;
PrintListReversingly_Iteratively(temp);
cout << "利用遞迴方法從尾到頭反過來列印連結串列的值如下:" << endl;
PrintListReversingly_Recursively(temp);
cout << endl;
return 0;
}
測試結果如下:
利用棧方法從尾到頭反過來列印連結串列的值如下:
6 5 2 4 1
利用遞迴方法從尾到頭反過來列印連結串列的值如下:
6 5 2 4 1
請按任意鍵繼續. . .