【每天一題】劍指 Offer 06. 從尾到頭打印鏈表

輸入一個鏈表的頭節點,從尾到頭反過來返回每個節點的值(用數組返回)。

示例 1:

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

用棧打印

棧的特點是後進先出,即最後壓入棧的元素最先彈出。考慮到棧的這一特點,使用棧將鏈表元素順序倒置。從鏈表的頭節點開始,依次將每個節點壓入棧內,然後依次彈出棧內的元素並存儲到數組中。

僞代碼

1. 創建一個棧,用於存儲鏈表的節點
2. 創建一個指針,初始時指向鏈表的頭節點
3. 當指針指向的元素非空時,重複下列操作:
	2.1 將指針指向的節點壓入棧內
	3.2 將指針移到當前節點的下一個節點
4. 獲得棧的大小 size,創建一個數組 print,其大小爲 size
5. 創建下標並初始化 index = 0
6. 重複 size 次下列操作:
	6.1 從棧內彈出一個節點,將該節點的值存到 print[index]
	6.2 將 index 的值加 1
7. 返回 print

圖1
圖2
圖3
圖4
圖5
圖6
圖7
圖8
class Solution {
    public int[] reversePrint(ListNode head) {
        Stack<ListNode> stack = new Stack<ListNode>();
        ListNode temp = head;
        while (temp != null) {
            stack.push(temp);
            temp = temp.next;
        }
        int size = stack.size();
        int[] print = new int[size];
        for (int i = 0; i < size; i++) {
            print[i] = stack.pop().val;
        }
        return print;
    }
}

時間複雜度:O(n)O(n)。正向遍歷一遍鏈表,然後從棧彈出全部節點,等於又反向遍歷一遍鏈表。
空間複雜度:O(n)O(n)。額外使用一個棧存儲鏈表中的每個節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章