JS 剑指Offer(四) 从尾到头打印链表

题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

首先定义一下链表中的节点,关于链表这个数据结构在另外一篇文章中会详细讲

 

1         function ListNode(val) {
2               this.val = val;
3               this.next = null;
4         }

 

理清一下思路,我们要反转一个链表,可以遍历链表,将链表中的元素存到一个数组中,然后按照反转的顺序保存

好了,思路清晰了,那我们当然是要用栈这个数据结构,要记住,在改变顺序或者操作数组的时候,是和栈分不开的

 1         var reserveprint = function(head){
 2             const stack = []
 3             let node = head
 4             while(node){
 5                 stack.push(node.val);
 6                 node = node.next;
 7             }
 8             
 9             const reverse = []
10             while(stack.length){
11                 reverse.push(stack.pop())
12             }
13             
14             return reverse
15         }

这里用到了辅助栈的想法,首先建立一个辅助栈stack,遍历一遍整个单链表,将单链表中节点的value顺序push到stack里

此时,辅助栈stack中元素的顺序是和单链表相同的,接下来要做的自然就是反转一下这个数组,很简单,将辅助栈stack中尾部的元素取出来依次push到最终的结果栈reverse中即可

以上应用辅助栈的想法很好,但是我个人在使用JS的时候很少会这么麻烦,因为JS数组方法中有unshift,可以直接向数组的开头不断添加元素,更精简的方法如下

1         function reversePrint2(){
2             let res = []
3             let head = this.head
4             while(head){
5                 res.unshift((head.val))
6                 head = head.next
7             }
8             return res
9         }

好了,以上就是JS剑指Offer的第四题,从尾到头打印链表,如果小伙伴们有更好的方法,不妨在评论区留言哦

 

posted @ 2020-03-30 21:56  前端攻城狮4536251  阅读(162)  评论(0)    收藏  举报