题目:从尾到头打印链表。输入一个单链表的头结点,从尾到头反过来打印出每个结点的值。链表结点定义如下:
struct ListNode{ int m_nValue; ListNode* m_pNext; };
分析:考虑栈操作的类似性,可以建立堆栈然后输出。实现代码如下:
void PrintListReversingly_Iteratively(ListNode* pHead){ std::stack<ListNode*>=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); } }
递归的方法有个问题:当链表非常长时,就会导致函数调用的层级很深,从而有可能导致函数调用的栈溢出。显式的栈基于循环实现的代码的鲁棒性要好一些。
本文出自 “仙路千叠惊尘梦” 博客,请务必保留此出处http://secondscript.blog.51cto.com/9370042/1581618
原文地址:http://secondscript.blog.51cto.com/9370042/1581618