从尾到头打印单链表

  要实现从尾到头打印链表,方法很多,但常用的有两种方法,一是递归,二是利用栈。

  首先定义一个链表: 

struct ListNode{
  int m_nKey;          //
  ListNode* m_pNext;      //指向下一个值的指针
}

 

 

  第一种利用递归的方法:

  

void PrintListReversingly_Recursively(ListNode* pHead){
  if(pHead!=NULL)  {   //先判断链表是否为空
    if(p_Head->m_pNext !=NULL) {  //然后判断链表中只有一个元素
      PrintListReversingly_Recursively(pHead->m_pNext);  //递归到下一个元素
    }
     printf("%d\t",pHead->m_nValue);  //如果只有一个元素的时候,就打印这个元素,此时已经递归到最后一个元素,即从最后一个元素开始打印,然后层层返回,依次打印到第一个元素
  }
}

 

  第二种方法是调用栈,因为栈是先进后出的,所以我们需要先创建一个栈,用来存储链表中的元素,当链表中所有的元素都被栈存储后,就将这些元素依次打印 

#include <stack>
using namespace std;

void PrintListReversingly_stack(ListNode* pHead){
  stack<ListNode*> nodes;    //创建一个能够容纳ListNode*类型元素的栈
  ListNode* pNode=pHead;   //创建ListNode*类型的头指针,用来指向链表的第一个元素
  while(pNode != NULL){   //当pNode还没有遍历完链表时
    nodes.push(pNode);   //就将当前所指的元素放在栈里面
    pNode=pNode->m_pNext;    //然后继续指向链表中的下一个元素,直到将所有的元素都放在栈中
  }
   while(!nodes.empty()){   //此时开始遍历栈里面的元素
     pNode=nodes.top();    //首先将pNode指针指向栈顶元素
     printf("%d\t",pNode->m_nValue);  //依次打印出栈里面的元素
     nodes.pop();   将已打印的元素弹出栈,然后指向下一个元素
   }
}    

  这两种方法相比而言,递归的方法比较简单,但是递归的本质就是一个栈结构。如果链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。显示用栈基于循环实现的代码鲁棒性要好一些。

posted @ 2013-12-14 20:24  LOSER Z  阅读(324)  评论(0编辑  收藏  举报