java输入一个数组逆序输出_一个“逆序输出单向链表”都能给面试官讲出这么多种实现方式

厚颜无耻的给大家要个赞,哈哈哈!创作不易希望大家可以多多鼓励鼓励。

dc0454effd04addfd15cd6282a88c010.png

今天我们一起聊一聊“逆序输出单向链表”,这也是一个比较常见的面试题了。我们公司最近招聘时有问到这个问题,但是也有一些回答不上来的,为此我想着写一篇文章,记录一下我知道的几种解决方案,以备不时之需,也希望可以帮助到有需要的人。

以下内容会涉及到:“链表数据结构、递归算法、栈。”如果有对这些不太了解的可以看一下之前的文章,都有详细的介绍。

8109884031ec98265432f6965064a347.png

什么是逆序输出单向链表

通过字面含义相信大家也能大概明白,所谓的逆序输出单向链表就是从链表尾部依次输出打印链表。这么一说是不是感觉还挺容易的。

题目含义明白了,现在就让我们动手实现一下。

第一种解决方案

思路:先将原链表进行翻转,然后打印翻转后的链表。

这种方式就不在此处进行演示了,如果大家不太了解反转链表,可以翻阅一下之前的文章,有一篇是专门介绍“反转单向链表”的。并且这种方式本人不建议使用,因为需要额外的创建出一条链表,效率比较低。

第二种解决方案

通过递归实现链表的逆序打印。

代码展示:

/** * 逆序输出链表(使用递归) * * @param node */public void showNode(Node node){    if(node.next != null){      // 没有到达链表尾部,递归调用本身。      showNode(node.next);    }    // 输出节点内容    System.out.println(node.data);}

代码讲解:每次调用判断链表是否还有下一个节点,有的话递归调用本身,一直到链表尾部结束递归调用。然后依次从链表尾部输出每个节点的内容。为什么是从链表尾部输出每个节点,相信了解递归的都应该清楚,就不在此赘述了,如果有不是特别明白的,可以翻看一下之前的文章。

第三种解决方案

实现思路:通过栈结构“先进后出”的特性实现对链表的逆序输出。

代码展示:

/** * 逆序输出链表(使用栈) */public void reversePrint(Node headNode) {    if (headNode == null || headNode.next == null) {      return;    }    // 初始化栈    Stack stack = new Stack<>();    // 创建临时变量    Node cur = headNode.next;    while (cur != null) {      // 链表节点入栈      stack.push(cur);      // 后移变量      cur = cur.next;    }    // 弹栈    while (stack.size() > 0) {      System.out.println(stack.pop().data);    }}

代码讲解:每次循环从链表中获取一个节点压入栈中,直到将整个链表的节点都压入栈中。在依次将栈中的数据弹出,从而实现链表的逆序输出。

结语

以上就是我知道的三种逆序输出单向链表的方法,如果有更好的方式大家可以在评论区告诉我。今天的分享就到这了,如果文章哪里写的有问题的也希望大家可以提出来,我会积极修改,虚心受教,谢谢大家了。

0c90834bb2e478de9b3cc1d35074ba7d.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值