LeetCode-劍指offer-06-從尾到頭列印連結串列
阿新 • • 發佈:2021-02-05
技術標籤:劍指offer刷題記錄LeetCode遞迴連結串列
目錄
原題要求
輸入一個連結串列的頭節點,從尾到頭反過來返回每個節點的值(用陣列返回)。
示例 1:
輸入:head = [1,3,2]
輸出:[2,3,1]
限制:
0 <= 連結串列長度 <= 10000
解題過程
遞迴 | 時間複雜度: O ( n ) O(n) O(n) | 空間複雜度 O ( n ) O(n) O(n) | 推薦
雖然時間效能不及下方的迭代,但是理解遞迴的呼叫過程有助於後續的學習!
ps:遞迴從下圖就可以看出,其實就好像在所有的元素裡走了一圈。如果執行操作在遞迴之前,則在每個正向呼叫的過程中都執行一遍。但是!如果執行操作在遞迴之後,就會在最終的遞迴出口處開始,繼續執行沒有執行完的操作!有那味道沒!哈哈哈
詳情可以參考:三張圖簡單理解回溯演算法
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) | 推薦
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;
}
}