这是崔斯特的第一百一十二篇原创文章
努力、奋斗 (๑• . •๑)
从尾到头打印链表
题目描述
输入一个链表,按链表值从尾到头的顺序返回一个 ArrayList。
思路
链表从头到尾输出会比较简单,于是我们很自然的想到把链表中链接节点的指正翻转过来,改变链表的方向,然后就可以从头到尾的输出了。但是该方法会修改原来链表的结构,这应该不是一个好的选择。
在面试中,如果我们打算修改输入的数据,最好先问面试官是否允许修改。
这道题肯定需要遍历链表的,但是遍历肯定是顺序,可是最终需要的是从尾到头,这就是典型的”先进先出“,可以使用栈实现。遍历该链表时,没经过一个节点,便把该节点放入栈中。遍历结束之后,再从栈顶输出所有值。
解法
解法一【推荐】
遍历链表,每个链表结点值 push 进栈,最后将栈中元素依次 pop 到 list 中。
|
|
面试官看到使用了栈,会不会手动让你完成栈的实现呢。下面有栈的实现。
解法二【不推荐】
利用递归方式:
- 若不是链表尾结点,继续递归;
- 若是,添加到 list 中。
这种方式不推荐,当递归层数过多时,容易发生 Stack Overflow。
|
|
解法三
通过遍历实现
|
|
栈
研究了下源码,简单实现了下:
|
|
JDK源码中是这样的
|
|
细节满满,想要看更多实现就需要去看Vector
的源码了。Vector
日常使用的太少了,是线程安全的,但实现同步需要很高的花费,因此访问比ArrayList
慢。