题目:输入一个链表的头结点,从尾到头打印链表。
本篇博客共介绍两种方式(c++代码):
方法1:递归方式
假设要求不改变链表的结构。
这种方式想必大家都可以想到的,借助链表的头文件(SList.h),此处不再粘贴代码。
https://blog.csdn.net/kai29/article/details/78966034
//递归方式
void PrintTailToFrontR(SListNode* pHead)
{
if (pHead != NULL)
{
if (pHead->_next != NULL)
{
PrintTailToFrontR(pHead->_next);
}
printf("%d ", pHead->_data);
}
}
此方式虽然看起来简洁,如果链表很长时,就会导致函数的调用层级很深,有可能会导致函数栈溢出。
方法2:借助栈实现
思路:将链表从尾至头打印,遍历的顺序是从头到尾,输出的顺序时从尾到头,即第一个遍历的结点最后一个输出,最后一个遍历的结点第一个输出。显而易见这就是“先进后出”——栈问题。相比递归方式鲁棒性较好。
所谓鲁棒性是指程序能够判断输入是否合乎规范要求,并对不合理的输入予以合理的处理。
#include <stack>
#include "SList.h"//见链接
#include <iostream>
#include <windows.h>
using namespace std;//命名空间
void PrintTailToFront(SListNode* pHead)
{
SListNode* node = pHead;
stack <SListNode *> s;
while (node != NULL)
{
//入栈
s.push(node);
node = node->_next;
}
while (!s.empty())//栈不为空时
{
node = s.top();//获得栈顶元素
printf("%d ", node->_data);//打印栈顶元素
s.pop();//出栈
}
printf("\n");
}
测试部分:
void Test()
{
SListNode* list = NULL;
SListPushFront(&list, 4);
SListPushFront(&list, 3);
SListPushFront(&list, 2);
SListPushFront(&list, 1);
//SListPrint(list);
//PrintTailToFront(list);//栈
PrintTailToFrontR(list);//递归
}