1. 程式人生 > >C++從尾到頭列印連結串列(劍指offer面試題6)

C++從尾到頭列印連結串列(劍指offer面試題6)

下面是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
請按任意鍵繼續. . .