输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
解题思路:
通常打印一个只读操作不希望打印时修改内容。题目要求从尾到头打印列表值,这里一定要遍历链表,遍历列表是从头到尾,而输出顺序是从尾到头,自然而然想到用栈实现。
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> result = new ArrayList<>();
if(listNode==null){
return result;
}
Stack<Integer> stack = new Stack<>();
while(listNode!=null){
stack.push(listNode.val);
listNode = listNode.next;
}
while(!stack.isEmpty()){
result.add(stack.pop());
}
return result;
}
续:既然想到了用栈实现这个函数,而递归的本质就是一个栈结构,于是又顺其自然的想到使用递归实现该函数。
ArrayList<Integer> result = new ArrayList<>();//这里ArrayList一定是成员变量。
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode==null){
return result;
}
if(listNode.next!=null){
result = printListFromTailToHead(listNode.next);
}//当指针没有到链表尾节点时递归,当到达尾节点时则输出。保证了从尾到头输出链表值
result.add(listNode.val);
return result;
}
注:递归代码简单,但是当链表长度不断增加的时候,就会导致递归深度加深,从而有可能导致函数调用栈溢出,显然使用栈基于循环来实现代码的鲁棒性要好一些。