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

一道面试题要求从尾到头打印链表的节点值。本文分析了三种解决方案:逆置链表后打印、递归和迭代。由于逆置会改变链表结构,可能不被允许。递归方法简单但可能导致栈溢出,故推荐使用迭代法,通过栈来模拟递归行为。
摘要由CSDN通过智能技术生成

题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值。

分析

这道题有如下几种解决方案:

  1. 将链表逆置,然后顺次打印
  2. 递归方案
  3. 迭代方案

如果逆置链表的话,会改变链表原先的结构。我们可以在面试时询问面试过是否可以改变链表,如果是肯定的回答,就可以采用这种办法。否则只能采用后面的方法。

逆置链表也很简单,只需要从第二个节点开始,顺次摘取一个节点头插就可以。

代码如下


list* PrintListInReversedOrder(list* &head)
{
    if(head==NULL || head->next==NULL)
        return head;
    list* tmp=NULL;
    list* cur=head->next;
    head->next=NULL;
    while(cur!=NULL)
    {
        tmp=cur->next;
        cur->next=head;
        head=cur;
        cur=tmp;
    }
    cur=head;
    while(cur!=NULL)
    {
        cout<<cur->data<<" ";
        cur=cur->next;
    }
    cout<<endl;
    return head;
}

递归方案很简单,如果当前函数参数所指向的节点是尾节点,则打印之。否则先打印它的下一个节点即可。

代码如下


void PrintListInReversedOrder(list* head)
{
    if(head==NULL)
        return;
    PrintListInReversedOrder(head->next);
    cout<<head->data<<" ";
}

但如果链表太长,采用递归的话可能会导致Stack OverFlow,所以更好的办法是用循环来控制。而递归在本质上就是一个栈结构(系统栈),所以我们可以用自定义的栈(数据结构栈)来模拟递归的行为以实现这种效果。

代码如下


#include<stack>
void PrintListInReversedOrder(list* head)
{                                                                 //此处不用判断head是否为空,并非忘记
    stack<list*> s;
    list* cur=head;
    while(cur!=NULL)
    {
        s.push(cur);
        cur=cur->next;
    }
    while(!s.empty())
    {
        cout<<s.top()->data<<" ";
        s.pop();
    }
}

以上

如果你有任何想法或是可以改进的地方,欢迎和我交流!

完整代码及测试用例在github上:点我前往

欢迎访问我的博客:Smart的个人博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值