反向鏈結串列 | Easy |LeetCode#206 Reverse Linked List
題目敘述
- 題目難度:
Easy
- 題目描述: 給定一個 linked list 的
head
,希望整個 list 反轉,並且回傳反轉後的list
解法
一開始的想法
1 | 1. 定義節點結構 |
後來我發現
head
跟tail 其實可以不用各別分開處理
我的解法
1 | /** |
說明
一開始宣告了三個指標變數:
tempNode
: 用於臨時保存當前節點的下一個節點current
: 用於走訪 linked list 的當前節點previous
: 用於保存當前節點的前一個節點,最終會成為反轉後的新的頭節點
初始化:
- 將
current
初始化為head
,即list的頭節點 - 將
previous
初始化為 NULL,因為反轉後的新頭節點的下一個節點應為 NULL
- 將
迴圈部分:
- 只要還有節點需要處理,就繼續反轉,直到遇到 NULL
- 一開始先保存當前節點的下一個節點,這樣在改變指標方向後不會丟失剩下的 list
- 將當前節點的
next
指標指向前一個節點 (previous
),這是實現反轉的關鍵一步 previous = current
: 移動 previous 指標,使其指向當前節點,為下一次迴圈做準備current = tempNode
: 移動 current 指標,使其指向原來的下一個節點,繼續處理下一個節點
當迴圈結束時,
previous
指向的是反轉後的 list 的頭節點,因為當current
為 NULL 時,previous
剛好是最後一個非空節點回傳
previous
執行結果
其他做法
1 | struct ListNode* reverseList(struct ListNode* head){ |
這是解答區其他人回覆的做法,也是 0ms,他的做法跟我的大同小異,但他的會需要額外去判斷是否為 empty list 並且把 head
指向 NULL 單獨出來做。
執行結果
看來這樣要多判斷的狀況,會添加將近 3ms…
時間複雜度分析
- 時間複雜度: $O(n)$: while迴圈這部分是traverse鏈結串列的主要邏輯,遍歷整個鏈結串列的時間複雜度是 $O(n)$,
n
會是節點數量 - 空間複雜度 $O(1)$: 三個指標(
tempNode
,current
,previous
):這些變量佔用常數空間 $O(1)$。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Kevin Liu's 部落格 || Technical || Travel!
評論