题目:从尾到头打印链表。输入一个单链表的头结点,从尾到头反过来打印出每个结点的值。链表结点定义如下:

struct ListNode{    int m_nValue;    ListNode* m_pNext;};

分析:考虑栈操作的类似性,可以建立堆栈然后输出。实现代码如下:

void PrintListReversingly_Iteratively(ListNode* pHead){    std::stack
=nodes;        ListNode* pNode=pHead;    while(pNode!=NULL){        nodes.push(pNode);        pNode=pNode->m_pNext;    }    while(!nodes.empty()){        pNode=nodes.top();        printf("%d\t",pNode->m_nValue);        nodes.pop();    }}

既然想到用堆栈,就可以想到递归在本质上也是堆栈结构,于是我们可以用递归来实现。要实现反过来输出链表,我们每访问到一个节点的时候,先递归输出她后面的结点,在输出该节点自身就可以了。实现代码如下:

void PrintListReversingly_Recursively(ListNode* pHead){    if(pHead!=NULL){        if(pHead->m_pNext!=NULL){            PrintListReversingly_Recursingly(pHead->m_pNext);        }        printf("%d\t",pHead->m_nValue);    }}

递归的方法有个问题:当链表非常长时,就会导致函数调用的层级很深,从而有可能导致函数调用的栈溢出。显式的栈基于循环实现的代码的鲁棒性要好一些。