方法一:利用栈实现
C++代码:
#include "stdafx.h" #include#include using namespace std; //链表中的结点类型 struct ListNode { int m_nKey; ListNode *m_pNext; }; //从尾到头打印链表 void PrintLinkedListReversely(ListNode *pHead) { stack 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 #include using namespace std; //链表中的结点类型 struct ListNode { int m_nKey; ListNode *m_pNext; }; //从尾到头打印链表 void PrintLinkedListReversely(ListNode *pHead) { stack 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#include 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 #include 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; }
基于递归的代码很简洁,但它存在缺点:当链表非常长的时候就会导致函数调用的层级很深,从而有可能导致栈溢出。显然相比方法一用栈基于循环实现的代码的鲁棒性更好些。