面试题:从尾到头打印链表

题目:输入一个链表的头结点,从尾到头打印链表。
本篇博客共介绍两种方式(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);//递归


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值