1. 程式人生 > >輸入一個連結串列的頭結點,從尾到頭反過來列印每個節點的值。

輸入一個連結串列的頭結點,從尾到頭反過來列印每個節點的值。

連結串列節點的定義:

  1. typedefstruct LinkNode  
  2. {  
  3.     int _value;  
  4.     struct LinkNode* _next;  
  5. }LinkNode,*pLinkNode;  

連結串列定義:

  1. typedefstruct LinkList  
  2. {  
  3.     LinkNode* _phead;  
  4. }LinkList,*pLinkList;  
演算法一:對於一個單鏈表的列印通常是從頭到尾依次遍歷並進行列印,對於遍歷的順序而言是“先遍歷後列印”,則:採用遞迴的方法,便可以實現從尾到頭列印單鏈表。
  1. //使用遞迴將單鏈表從尾到頭列印
  2. void Display_LinkList_EndToStart2(pLinkNode pNode)  
  3. {  
  4.     if(pNode == NULL)  
  5.     {cout<<"This LinkList is Empty!!!"<<endl;}  
  6.     if(pNode != NULL)  
  7.     {  
  8.         if(pNode->_next != NULL)  
  9.            Display_LinkList_EndToStart2(pNode->_next);  
  10.         cout<<pNode->_value<<"->"
    ;  
  11.     }  
  12. }  
演算法二:上面分析依據遍歷的順序與列印的是“先遍歷後列印”,根據這一特性,可以藉助棧來進行實現從尾到頭列印單鏈表。
  1. //藉助棧使得單鏈表從尾到頭輸出
  2. void Display_LinkList_EndStartTo1(pLinkList plink)  
  3. {  
  4.     assert(plink);  
  5.     if(plink->_phead == NULL)  
  6.     {cout<<"This LinkList is Empty!!!"<<endl;}  
  7.     stack<int> stack1;  
  8.     pLinkNode cur = plink->_phead ;  
  9.     while(cur != NULL)  
  10.     {  
  11.         stack1.push(cur->_value);  
  12.         cur = cur->_next ;  
  13.     }  
  14.     while(stack1.empty() != true)  
  15.     {  
  16.         cout<<stack1.top()<<"->";  
  17.         stack1.pop();  
  18.     }  
  19.     cout<<"NULL"<<endl;  
  20. }