重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
题目描述:输入一个链表的头结点,从尾到头反过来打印出每个节点的值
目前创新互联已为千余家的企业提供了网站建设、域名、雅安服务器托管、网站托管运营、企业网站设计、望城网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
链表的节点定义如下:
struct ListNode { int m_nValue; ListNode* m_pNext; };
分析:
一般情况下,遇到这种问题,首先应该问清楚面试官是否可以改变原有的链表结构,自己再做分析。
void PrintListReversingly_Iteratively(ListNode* pHead) { std::stacknodes; 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_Recursively(pHead->m_pNext); } printf("%d\t", pHead->m_nValue); } }
说明:用递归的代码看起来很简洁,但是如果一个链表非常长,于是递归调用的深度越深,就有可能导致栈溢出,因此利用循环实现的代码的鲁棒性(健壮性)会更好些。