一、题目
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
二、方法
法1–(非递归):
~从头节点加入Node,先加的往后排
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> lis = new ArrayList<>();
ListNode tmp = listNode;
while(tmp != null){
lis.add(0, tmp.val);
tmp = tmp.next;
}
return lis;
}
}
法2(使用栈)
import java.util.Stack;
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<ListNode> stack = new Stack<>();
ArrayList<Integer> ans = new ArrayList<>();
// 当每个元素不为空时加进去
while (listNode != null) {
stack.push(listNode);
listNode = listNode.next;
}
// 开始出栈
while (!stack.empty()) {
ans.add(stack.pop().val);
}
return ans;
}
}
时间复杂度和空间复杂度均为O(n)
法2:
递归的方式
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> lis = new ArrayList();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode != null){
// 使用next递归走到最后
printListFromTailToHead(listNode.next);
lis.add(listNode.val);
}
// 结束的条件是listNode==null
return lis;
}
}
当链表比较长时,递归,函数调用的栈溢出
时间复杂度和空间复杂度都为O(n)
3.思考
Tips:1、如果你要修改输入数据,先问面试官是否可以修改
@1:后进先出:使用栈来实现