4.从尾到头打印链表
描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
0 <= 链表长度 <= 10000
示例1
输入:{1,2,3}
返回值:[3,2,1]
示例2
输入:{67,0,24,58}
返回值:
[58,24,0,67]
题解
一、非递归
listNode 是链表,只能从头遍历到尾,但是输出却要求从尾到头,这是典型的"先进后出",我们可以想到栈!
ArrayList 中有个方法是 add(index,value),可以指定 index 位置插入 value 值所以我们在遍历 listNode 的同时将每个遇到的值插入到 list 的 0 位置,最后输出 listNode 即可得到逆序链表
import java.util.*;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
ListNode tmp = listNode;
while(tmp!=null){
list.add(0,tmp.val);
tmp = tmp.next;
}
return list;
}
}
二、递归
利用递归,借助系统的"栈"帮忙打印
import java.util.*;
public class Solution {
ArrayList<Integer> list = new ArrayList();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode!=null){
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
}
三、利用栈
利用栈遍历,最后再把栈弹出到列表
public ArrayList<Integer> printListFromTailToHead4(ListNode listNode) {//13 ms 9688KB
ArrayList<Integer> list=new ArrayList<>();
Stack<Integer> stack=new Stack<>();
while(listNode != null){
stack.push(listNode.val);
listNode=listNode.next;
}
while(!stack.empty()){
list.add(stack.pop());
}
return list;
}
四、反转链表
先反转链表,再遍历存入list
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {//12 ms 9752KB
ArrayList<Integer> list=new ArrayList<>();
ListNode pre=null;
ListNode cur=listNode;
ListNode temp=cur;
while(cur != null){
temp=cur.next;
cur.next=pre;
pre=cur;
cur=temp;
}
while(pre != null){
list.add(pre.val);
pre=pre.next;
}
return list;
}