1. 程式人生 > 其它 >LeetCode-劍指offer-06-從尾到頭列印連結串列

LeetCode-劍指offer-06-從尾到頭列印連結串列

技術標籤:劍指offer刷題記錄LeetCode遞迴連結串列

目錄


原題要求

原題連結劍指 Offer 06. 從尾到頭列印連結串列

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

示例 1

輸入:head = [1,3,2]
輸出:[2,3,1]

限制

0 <= 連結串列長度 <= 10000


解題過程

遞迴 | 時間複雜度: O ( n ) O(n) O(n) | 空間複雜度 O ( n ) O(n) O(n) | 推薦

雖然時間效能不及下方的迭代,但是理解遞迴的呼叫過程有助於後續的學習!

ps:遞迴從下圖就可以看出,其實就好像在所有的元素裡走了一圈。如果執行操作在遞迴之前,則在每個正向呼叫的過程中都執行一遍。但是!如果執行操作在遞迴之後,就會在最終的遞迴出口處開始,繼續執行沒有執行完的操作!有那味道沒!哈哈哈

詳情可以參考:三張圖簡單理解回溯演算法

image-20210204205844834
在這裡插入圖片描述

class Solution {
    List<Integer> list = new ArrayList<>();
    public int[] reversePrint(ListNode head) {
        recur(head);
        int[] res = new int[list.size()];
        // 正向遍歷即可,在list中,元素已經反轉
        for(int i = 0; i < res.length; i++) res[i] = list.get
(i); return res; } // 遞迴的方式 public void recur(ListNode head){ if(head == null) return; recur(head.next); // add操作要在遞迴函式之後 // 第一次add操作,就是最後一次遞迴結束的時候 list.add(head.val); } }

迭代 | 時間複雜度: O ( n ) O(n) O(n) | 空間複雜度 O ( n ) O(n) O(n) | 推薦

image-20210204211826209

class Solution
{ public int[] reversePrint(ListNode head) { int count = countNodes(head); int[] res = new int[count]; ListNode cur = head; // 逆序給陣列賦值即可 for(int i = count - 1; i >= 0; i--){ res[i] = cur.val; cur = cur.next; } return res; } // 首先計數,得到節點數量 public int countNodes(ListNode head){ int count = 0; ListNode cur = head; while(cur != null){ count++; cur = cur.next; } return count; } }