通過刷題劍指offer,可以有效提升面試的成功率,這是因爲技術崗位的面試總是離不開算法題。如果想要在算法題方面表現得好的話,刷題是唯一的捷徑。
正所謂:書山有路勤爲徑
題目描述
輸入一個鏈表,按鏈表從尾到頭的順序返回一個ArrayList。
解題思路
題目給了我們一個單向鏈表,我們需要反向輸出每個節點的值。然而,單向鏈表的一個特點就是隻能正向遍歷,無法反向遍歷,因爲每個節點只有指向下一個節點的指針,並沒有指向上一個節點的指針,所以無法訪問上一個節點。
既然我們沒有辦法一邊遍歷鏈表節點,一邊輸出節點的值,那麼我們是否可以先把每個節點的值儲存起來,最後再將他們顛倒過來呢?
有一個數據結構的特性非常符合我們的要求,那就是棧 (stack)。
由於棧有後進先出的特點,我們只需要將所有節點的值壓入棧裏,然後再依次彈出,它們的順序就會被顛倒過來了。
算法
算法的基本步驟可以分解爲:
- 創建一個棧
- 遍歷鏈表並將節點的值壓入棧
- 創建一個ArrayList
- 將棧裏的元素彈出並插入到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)。