这道题其实应该很简单,我用的也是暴力解法,一开始的想法是用数组先存储,再倒过来就可以了,后来想着数组长度不好定义,所以就选择用了ArrayList,对链表进行从头至尾访问,并将访问的数据插入到ArrayList的第一位,之后再转存到数组就可以了,代码如下:
public int[] reversePrint(ListNode head) {
ArrayList<Integer> a=new ArrayList<Integer>();
if(head==null){
int[] t=new int[0];
return t;
}
while(head!=null){
a.add(0,head.val);
head=head.next;
}
int[] res=new int[a.size()];
for(int i=0;i<a.size();i++){
res[i]=a.get(i);
}
return res;
}
但这样耗时会很长,我想了想,应该是在将链表数据转存的ArrayList时每次都是从头插入,所以导致每次都需要对后面的数据进行移动(本质还是数组),所以我在转存时将数据存储到ArrayList的尾部,然后在放入到结果时进行倒序,耗费的时间就只有之前的一半了:
public int[] reversePrint(ListNode head) {
ArrayList<Integer> a=new ArrayList<Integer>();
if(head==null){
int[] t=new int[0];
return t;
}
while(head!=null){
a.add(head.val);
head=head.next;
}
int[] res=new int[a.size()];
for(int i=0;i<a.size();i++){
res[i]=a.get(a.size()-1-i);
}
return res;
}
虽然简单,但还是有很多细节可以抓住,而且这道题其实本意应该是用栈进行解决的,通过利用栈的先进后出的特性完成倒序访问的功能:
public int[] reversePrint(ListNode head) {
Stack<Integer> a=new Stack<>();
while(head!=null){
a.push(head.val);
head=head.next;
}
int size=a.size();
int[] res=new int[size];
for(int i=0;i<size;i++){
res[i]=a.pop();
}
return res;
}
在重做这个时我发现前面所做的排除head=null的情况是不必要的,因为为空的话后面也不会继续下去,而是返回空数组,还有一个点是要提前将栈的size赋值给某个变量,否则如果在if循环中直接写i<a.size()的话size会随着a的数据弹出而减小,达不到目的。