/********************************************************* 题目:输入一个链表的头结点,从为到头反过来打印每个节点的值 **********************************************************/ #include <iostream> #include <stack> using namespace std; struct ListNode{ int m_nKey; ListNode* m_pNext; }; //添加节点 void addToTail(ListNode** pHead, int value) { ListNode* pNode = new ListNode(); pNode->m_nKey = value; pNode->m_pNext = NULL; if(*pHead == NULL) { *pHead = pNode; } else { ListNode* pCurrentNode = *pHead; while(pCurrentNode->m_pNext != NULL) pCurrentNode = pCurrentNode->m_pNext; pCurrentNode->m_pNext = pNode; } } /* 版本1:需要改进之处1)形参类型;2)头指针处理 //以相反顺序打印链表 void printListInReversedOrder(ListNode** pHead) { if(pHead == NULL || *pHead == NULL) return; stack<ListNode*> listStack; ListNode* pCurrentNode = *pHead; if( pCurrentNode == *pHead) listStack.push(pCurrentNode); while(pCurrentNode->m_pNext != NULL) { listStack.push(pCurrentNode->m_pNext); pCurrentNode = pCurrentNode->m_pNext; } while(!listStack.empty()) { pCurrentNode = listStack.top(); cout << pCurrentNode->m_nKey << ‘\t‘; listStack.pop(); } } */ /*版本2:处理链表时,当不改变链表结构时,形参设为ListNode* pHead足够 void printListInReversedOrder(ListNode* pHead) { if(pHead == NULL) return; stack<ListNode*> nodes; ListNode* pNode = pHead; while(pNode != NULL) //将遍历过的数进栈 { nodes.push(pNode); pNode = pNode->m_pNext; } while(!nodes.empty()) //将栈内的数据出栈,然后显示 { pNode = nodes.top(); cout << pNode->m_nKey << ‘\t‘; nodes.pop(); } } */ void printListInReversedOrder(ListNode* pHead) { if(pHead == NULL) return; if(pHead->m_pNext != NULL) printListInReversedOrder(pHead->m_pNext); cout << pHead->m_nKey << ‘\t‘; } //单元测试 //一般情况 void test1() { ListNode* pRoot = NULL; addToTail(&pRoot,5); addToTail(&pRoot,7); addToTail(&pRoot,3); addToTail(&pRoot,9); addToTail(&pRoot,1); printListInReversedOrder(pRoot); } //只有一个节点 void test2() { ListNode* pRoot = NULL; addToTail(&pRoot,5); printListInReversedOrder(pRoot); } //空链表 void test3() { ListNode* pRoot = NULL; printListInReversedOrder(pRoot); } int main() { test1(); cout << endl; test2(); cout << endl; test3(); return 0; }这里的问题很显然是先进后出的问题,所以使用栈来实现。每经过一个节点,就将它放入栈中。当遍历完整个链表后,
又由于递归的本质就是一个栈结构,所以也可用用递归实现,如版本3。
==参见剑指offer
原文:http://blog.csdn.net/walkerkalr/article/details/20234859