劍指offer06——從尾到頭列印連結串列
阿新 • • 發佈:2020-08-19
題目描述:
輸入一個連結串列的頭節點,從尾到頭反過來返回每個節點的值(用陣列返回)。
題解1:遞迴。遞迴終止條件:head = null,意味著遍歷到了連結串列的尾部,同時也意味著,可以回溯遞迴的值。
第一次遞迴:recur(1)->recur(3)
第二次遞迴:recur(3)->recur(2)
第三次遞迴:recur(2)->null;
此時進行回溯:將值新增到陣列中
第一次回溯:add(2)
第二次回溯:add(3)
第三次回溯:add(1)
最後列印陣列即從尾到頭遍歷了連結串列,因為是將連結串列的值儲存陣列中,所以並未改變原連結串列的狀態。
//遞迴 ArrayList<Integer> temp = newArrayList<>(); public int[] reversePrint(ListNode head) { recur(head); int[] res = new int[temp.size()]; for (int i = 0;i<res.length;i++){ res[i] = temp.get(i); } return res; } /* 一直遞迴到null結束,結束後的值是null的前一個值,也就是陣列的最後一個值。*/ public void recur(ListNode head){ if (head == null){ return; } recur(head.next); temp.add(head.val); }
題解二:利用棧
從尾到頭列印完美符合棧的特點:先進後出
將元素依次入棧再依次出棧即可,Java中可以使用LinkedList實現棧。
入棧:addLast將元素新增到列表末尾。
出棧:removeLast刪除並返回列表尾最後一個元素(不能使用getLast,因為getLast會一直返回表尾最後一個,返回的都是同一個元素)
//輔助棧方法 public int[] reversePrint(ListNode head) { LinkedList<Integer> stack = new LinkedList<>(); while (head != null) { stack.addLast(head.val); head = head.next; } int[] res = new int[stack.size()]; for (int i =0 ;i<res.length;i++){ res[i] = stack.removeLast(); } return res; }