力扣 - 劍指 Offer 06. 從尾到頭列印連結串列.md

linzeliang發表於2021-11-06

題目

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

思路1(遞迴)

  • 首先先遍歷整個臉表,計算出連結串列的長度(用於初始化陣列)。然後進行遞迴,從連結串列頭部遞迴到尾部,這期間什麼都不做,直到遞迴到最後一個節點的時候開始返回,開始返回的同時吧當前節點的值加入到res陣列

程式碼

class Solution {
    int[] res;
    int index = 0;

    public int[] reversePrint(ListNode head) {
        // 先統計連結串列的總節點數量
        int count = 0;
        ListNode temp = head;
        while (temp != null) {
            count++;
            temp = temp.next;
        }
        res = new int[count];

        // 進行遞迴
        help(head);

        // 輸出結果
        return res;
    }

    public void help(ListNode node) {
        if (node == null) {
            return;
        }
        help(node.next);
        res[index++] = node.val;
    }
}

複雜度分析

  • 時間複雜度:\(O(N)\),遍歷一遍連結串列所花費的時間
  • 空間複雜度:\(O(N)\),遞迴所需要的空間

思路2(棧)

  • 使用棧的先進後出FILO原則,順序遍歷連結串列,將連結串列的元素依次加入到棧中。接下來將棧的元素一個個pop彈出來放到res陣列中即可(因為是先進先出,所以此時棧的最後一個元素要先彈出,因此可以實現從尾到頭遍歷)

程式碼

class Solution {
    public int[] reversePrint(ListNode head) {
        // 將連結串列的元素依次入棧
        LinkedList<Integer> stack = new LinkedList<>();
        while (head != null) {
            stack.push(head.val);
            head = head.next;
        }

        int[] res = new int[stack.size()];
        // 將棧元素彈出放到res中
        int index = 0;
        while (!stack.isEmpty()) {
            res[index++] = stack.pop();
        }
        
        return res;
    }
}

複雜度分析

  • 時間複雜度:\(O(N)\)
  • 空間複雜度:\(O(N)\),輔助棧使用了\(O(N)\)的空間

相關文章