方法一:利用棧實現
C++代碼:
#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;
//鏈表中的結點類型
struct ListNode
{
int m_nKey;
ListNode *m_pNext;
};
//從尾到頭打印鏈表
void PrintLinkedListReversely(ListNode *pHead)
{
stack<ListNode *> tempStack;
if (pHead != NULL)
{
ListNode *pCurrent = pHead;
ListNode *pStackNode = NULL;
while (pCurrent != NULL)
{
tempStack.push(pCurrent);
pCurrent = pCurrent->m_pNext;
}
while (!tempStack.empty())
{
pStackNode = tempStack.top();
cout << pStackNode->m_nKey << " ";
tempStack.pop();
}
cout << endl;
}
}
#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;
//鏈表中的結點類型
struct ListNode
{
int m_nKey;
ListNode *m_pNext;
};
//從尾到頭打印鏈表
void PrintLinkedListReversely(ListNode *pHead)
{
stack<ListNode *> tempStack;
if (pHead != NULL)
{
ListNode *pCurrent = pHead;
ListNode *pStackNode = NULL;
while (pCurrent != NULL)
{
tempStack.push(pCurrent);
pCurrent = pCurrent->m_pNext;
}
while (!tempStack.empty())
{
pStackNode = tempStack.top();
cout << pStackNode->m_nKey << " ";
tempStack.pop();
}
cout << endl;
}
}
方法二:遞歸實現
C++代碼:
#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;
//鏈表中的結點類型
struct ListNode
{
int m_nKey;
ListNode *m_pNext;
};
//從尾到頭打印鏈表
void PrintLinkedListReversely(ListNode *pHead)
{
if (pHead != NULL)
{
if (pHead->m_pNext != NULL)
{
PrintLinkedListReversely(pHead->m_pNext);
}
cout << pHead->m_nKey << " ";
}
}
int _tmain(int argc, _TCHAR* argv[])
{
bool isHeadNode = true;
ListNode *pHeadNode = NULL;
ListNode *pListNode = NULL;
ListNode *pCurrentTail = NULL;
while (1)
{
if (isHeadNode)
{
pHeadNode = new ListNode();
cin >> pHeadNode->m_nKey;
pHeadNode->m_pNext = NULL;
pCurrentTail = pHeadNode;
isHeadNode = false;
}
else
{
pListNode = new ListNode();
cin >> pListNode->m_nKey;
if (pListNode->m_nKey == -1)
{
break;
}
pListNode->m_pNext = NULL;
pCurrentTail->m_pNext = pListNode;
pCurrentTail = pListNode;
}
}
PrintLinkedListReversely(pHeadNode);
ListNode *pNode = pHeadNode;
ListNode *pNext = NULL;
while (pNode != NULL)
{
pNext = pNode->m_pNext;
delete pNode;
pNode = pNext;
}
system("pause");
return 0;
}
#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;
//鏈表中的結點類型
struct ListNode
{
int m_nKey;
ListNode *m_pNext;
};
//從尾到頭打印鏈表
void PrintLinkedListReversely(ListNode *pHead)
{
if (pHead != NULL)
{
if (pHead->m_pNext != NULL)
{
PrintLinkedListReversely(pHead->m_pNext);
}
cout << pHead->m_nKey << " ";
}
}
int _tmain(int argc, _TCHAR* argv[])
{
bool isHeadNode = true;
ListNode *pHeadNode = NULL;
ListNode *pListNode = NULL;
ListNode *pCurrentTail = NULL;
while (1)
{
if (isHeadNode)
{
pHeadNode = new ListNode();
cin >> pHeadNode->m_nKey;
pHeadNode->m_pNext = NULL;
pCurrentTail = pHeadNode;
isHeadNode = false;
}
else
{
pListNode = new ListNode();
cin >> pListNode->m_nKey;
if (pListNode->m_nKey == -1)
{
break;
}
pListNode->m_pNext = NULL;
pCurrentTail->m_pNext = pListNode;
pCurrentTail = pListNode;
}
}
PrintLinkedListReversely(pHeadNode);
ListNode *pNode = pHeadNode;
ListNode *pNext = NULL;
while (pNode != NULL)
{
pNext = pNode->m_pNext;
delete pNode;
pNode = pNext;
}
system("pause");
return 0;
}
基於遞歸的代碼很簡潔,但它存在缺點:當鏈表非常長的時候就會導致函數調用的層級很深,從而有可能導致棧溢出。顯然相比方法一用棧基於循環實現的代碼的魯棒性更好些。