1. 程式人生 > 實用技巧 >劍指offer06——從尾到頭列印連結串列

劍指offer06——從尾到頭列印連結串列

題目描述:

輸入一個連結串列的頭節點,從尾到頭反過來返回每個節點的值(用陣列返回)。

題解1:遞迴。遞迴終止條件:head = null,意味著遍歷到了連結串列的尾部,同時也意味著,可以回溯遞迴的值。

第一次遞迴:recur(1)->recur(3)

第二次遞迴:recur(3)->recur(2)

第三次遞迴:recur(2)->null;

此時進行回溯:將值新增到陣列中

第一次回溯:add(2)

第二次回溯:add(3)

第三次回溯:add(1)

最後列印陣列即從尾到頭遍歷了連結串列,因為是將連結串列的值儲存陣列中,所以並未改變原連結串列的狀態。

//遞迴
    ArrayList<Integer> temp = new
ArrayList<>(); 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;
    }

參考題解:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/solution/mian-shi-ti-06-cong-wei-dao-tou-da-yin-lian-biao-d/