从尾到头打印链表
从尾到头打印链表
http://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035
1. 递归
1.1 分析
递归的关键,先向下递归再执行本次操作,这样才会形成反序操作序列。递归结束时没有操作,结束的上一步中的操作是反序操作的第一步,在本题中就是list.add(tail.val)。
1.2 代码
import java.util.*; 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; } }
1.3 复杂度
空间:O(n)
时间:O(n)
2. 非递归
2.1 分析
利用ArrayList中add(index,value)的方法,实施头插法。
2.2 代码
import java.util.*; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> list = new ArrayList<>(); ListNode tmp = listNode; while(tmp!=null){ list.add(0,tmp.val); tmp = tmp.next; } return list; } }
2.3 复杂度
空间:O(1)
时间:O(n)
3. 栈
3.1 分析
借助栈,先入后出
3.2 代码
import java.util.ArrayList; import java.util.Stack; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { Stack<Integer> stack = new Stack<>(); ArrayList<Integer> list =new ArrayList<>(); while(listNode != null){ stack.push(listNode.val); listNode = listNode.next; } while(!stack.isEmpty()){ list.add(stack.pop()); } return list; } }
3.3 复杂度
空间 :O(n)
时间 : O(n)