一.题目
输入一个链表的头结点,从尾到头反过来打印出每个结点的值。
二.思路
本题有两种方式解决:
- 栈
- 递归
但需要注意的是:当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。显然用栈基于循环实现代码的鲁棒性更好一些。
三.代码
- 栈实现
void PrintListReversingly_Iteratively(ListNode* pHead){ std::stack<ListNode> nodes; ListNode* pNode = pHead; while(pNode != nullptr){ nodes.push(pNode); pNode = pNode->m_pNext; } while(!nodes.empty()){ pNode = nodes.top(); printf("%d ",pNode->m_nValue); nodes.pop(); } }
2. 递归实现
void PrintListReversingly_Iteratively(ListNode* pHead){ ListNode* pNode = pHead; if(pNode != nullptr){ if(pNode->m_pNext != nullptr) PrintListReversingly_Iteratively(pNode->m_pNext); printf("%d ",pNode->m_nValue); } }
四.本题考点
- 考查应聘者对单向链表的理解和编程能力
- 考查应聘者对循环、递归和栈3个相互关联的概念的理解