劍指offer 動畫圖解 | 從尾到頭打印鏈表

通過刷題劍指offer,可以有效提升面試的成功率,這是因爲技術崗位的面試總是離不開算法題。如果想要在算法題方面表現得好的話,刷題是唯一的捷徑。

正所謂:書山有路勤爲徑

題目描述

輸入一個鏈表,按鏈表從尾到頭的順序返回一個ArrayList。

解題思路

題目給了我們一個單向鏈表,我們需要反向輸出每個節點的值。然而,單向鏈表的一個特點就是隻能正向遍歷,無法反向遍歷,因爲每個節點只有指向下一個節點的指針,並沒有指向上一個節點的指針,所以無法訪問上一個節點。

既然我們沒有辦法一邊遍歷鏈表節點,一邊輸出節點的值,那麼我們是否可以先把每個節點的值儲存起來,最後再將他們顛倒過來呢?

有一個數據結構的特性非常符合我們的要求,那就是 (stack)。

由於棧有後進先出的特點,我們只需要將所有節點的值壓入棧裏,然後再依次彈出,它們的順序就會被顛倒過來了。

算法

算法的基本步驟可以分解爲:

  1. 創建一個棧
  2. 遍歷鏈表並將節點的值壓入棧
  3. 創建一個ArrayList
  4. 將棧裏的元素彈出並插入到ArrayList裏,直到棧爲空

算法代碼

import java.util.ArrayList;
import java.util.Stack;

public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    Stack<Integer> stack = new Stack<>();

    while (listNode != null) {
        stack.push(listNode.val);
        listNode = listNode.next;
    }

    ArrayList<Integer> arrayList = new ArrayList<>();

    while (!stack.isEmpty()) {
        int val = stack.pop();
        arrayList.add(val);
    }

    return arrayList;
}

算法動圖

在這裏插入圖片描述

算法效率

效率:O(n)

n 代表鏈表節點的個數。

遍歷 n 個節點,壓入 n 個節點入棧,從棧裏彈出 n 個節點並插入ArrayList中。因此,效率爲 O(n)。

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