题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
从头到尾打印的方式最简单,所以首先想到的是修改链表中节点的指针,将它反转过来,然后从头到尾打印。
但是通常打印是一个指针操作,不希望修改链表的结构。所以打印链表元素肯定要遍历链表。
我们需要从头到尾遍历链表,但是从尾到头输出打印,即遍历的第一个节点作为最后一个输出,先进后出,后进先出,想到了栈。
所以采取两种方式,一种是堆栈的方式,一种是递归的方式。
方法一:堆栈处理,对链表中的节点,从头到尾,每遍历一个,把它压入栈中,当链表遍历结束后,再从栈顶逐个弹出各节点的值,也就实现反向输出了。
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> stack=new Stack<>();
ArrayList<Integer> list=new ArrayList<>();
while(listNode!=null){//遍历listNode,将节点信息全部压入堆栈
stack.push(listNode.val);
listNode=listNode.next;
}
while(!stack.isEmpty()){
list.add(stack.pop());
}
return list;
}
}
方法二:递归的方法
访问节点时,先递归输出它后面的节点,再输出该节点。
ArrayList<Integer> list=new ArrayList<Integer>();写在了递归方法体之外,因此每次递归时list.add所添加的节点值都是添进同一个链表。
import java.util.ArrayList;
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;
}
}
方法三:和方法一差不多,只不过不用堆栈,而是用另外一个Linklist存储节点的值,然后倒序输出。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list=new ArrayList<>();
ArrayList<Integer> result=new ArrayList<>();
ListNode temp=listNode;
//将传进来的节点信息组成链表
while(temp!=null){
list.add(temp.val);
temp=temp.next;
}
for (int i = list.size()-1; i >=0; i--) {
result.add(list.get(i));
}
return result;
}
}