涉及的知识点
链表
题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
输入:
{67,0,24,58}
输出:
[58,24,0,67]
解题思路
从头到尾遍历链表,然后插入到数组中,注意这里因为是输出从尾到头的顺序,所以我们采用头插法,不用尾插法。
代码
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
if(listNode==null){
return list;
}
ListNode head = listNode;
while(head!=null){
list.add(0,head.val);
head=head.next;
}
return list;
}
}
复杂度
时间复杂度:O(n)
空间复杂度:O(n)
解题思路二
借助一个辅助空间,我们都知道栈的特性是先进后出,正好符合题目倒着输出的意思。
代码
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
if(listNode==null){
return list;
}
Stack<Integer> stack = new Stack<>();
ListNode head = listNode;
while(head!=null){
stack.push(head.val);
head=head.next;
}
while(!stack.isEmpty()){
list.add(stack.pop());
}
return list;
}
}
复杂度
时间复杂度:O(n)
空间复杂度:O(n)
解题思路三
采用递归的方式
代码
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;
}
}
复杂度
时间复杂度:O(n)
空间复杂度:O(n)