题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
思路1:
将链表值正序放到一个list里,再将该list倒序放入另外一个list。emmmmm有点傻。
public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> arr = new ArrayList<Integer>();
if(listNode==null){
return arr;
}
while (listNode.next!=null){
arr.add(listNode.val);
listNode = listNode.next;
}
arr.add(listNode.val);
ArrayList<Integer> arr1 = new ArrayList<Integer>();
for(int i=arr.size()-1;i>=0;i--){
arr1.add(arr.get(i));
}
return arr1;
}
时间复杂度O(n)吧。
思路2:
现将链表翻转,再顺序放入list中
public static ArrayList<Integer> printListFromTailToHead1(ListNode listNode) {
ArrayList<Integer> arr = new ArrayList<Integer>();
if(listNode==null){
return arr;
}
ListNode pre = null;
ListNode next = null;
while (listNode!=null){
next = listNode;
listNode=listNode.next;
next.next=pre;
pre = next;
}
while (next!=null){
arr.add(next.val);
next = next.next;
}
return arr;
}
思路3:
利用栈。将链表元素压入栈,最后顺序出战放入list。
public static ArrayList<Integer> printListFromTailToHead3(ListNode listNode) {
ArrayList<Integer> arr = new ArrayList<Integer>();
if(listNode==null){
return arr;
}
Stack<Integer> s = new Stack<Integer>();
while (listNode!=null){
s.push(listNode.val);
listNode = listNode.next;
}
while (!s.empty()){
arr.add(s.pop());
}
return arr;
}
思路4:
使用递归。
public static ArrayList<Integer> printListFromTailToHead4(ListNode listNode) {
if (listNode == null) {
return new ArrayList<>();
}
ArrayList<Integer> arr = printListFromTailToHead4(listNode.next);
arr.add(listNode.val);
System.out.println(arr);
return arr;
}