从尾到头打印链表
1、题目
输入一个链表的头节点,从尾到头反过来打印出每个节点的值。
输入参数:链表的头节点
输出结果:在屏幕上打印每个节点的值
2、解题
解这道题的关键在于 “后进先出” 的思想,因此这道题可以用栈或递归的方式解决。
思路一:栈
- 遍历链表,将节点进栈
- 获得链表顶部的节点,打印节点值
- 依次出栈,直到栈为空
思路二:递归
- 若当前节点不为空且下一节点不为空,不断递归下一个节点,直到最后一个节点
- 打印节点的值
3、代码
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\t", pNode->m_nValue);
nodes.pop();
}
}
void PrintListReversingly_Recursively(ListNode* pHead) {
if (pHead != nullptr) {
if (pHead->m_pNext != nullptr) {
PrintListReversingly_Recursively(pHead->m_pNext);
}
printf("%d\t", pHead->m_nValue);
}
}
4、思路1和思路2的比较
尽管递归的代码较为简洁,但存在这样一个问题:
当链表非常长的时候,就会导致函数调用的层级很深,有可能导致函数调用栈移出。
因此,使用栈基于循环实现的代码的鲁棒性要好一些。
5、注意点
- 使用栈的时候记住循环的判决条件
- 使用递归的时候,注意到达尾结点的判决条件