【Leetcode解題】206. Reverse Linked List
題目
- 題目連結
- 目標函式 :
reverseList(head)- Input :
head: ListNode - Output :
ListNode
- Input :
解題概念
- 題意 : 給定一 Linked List
head,需要將其反轉 (如下圖)
我的寫法
- 想法 : 這題也是 Linked List 範疇中很經典的一題,可使用雙重指標來解題
首先設定起始點
ptr指向None、qtr指向 Node 1 (如圖)
接著需依照此步驟去重複執行 (如圖) :
temp = qtr.next: 找出下一個節點qtr.next: 將qtr指向節點的next指回ptrptr做 shiftingqtr做 shifting
直到
qtr指向None時,代表已到終點。此時ptr就會指向新 Linked List 的起點,即可直接回傳
- 程式碼 :
1
2
3
4
5
6
7
8
9
10
11
12def reverseList(self, head):
if not head: return None
ptr = None
qtr = head
while qtr:
temp = qtr.next
qtr.next = ptr
ptr = qtr
qtr = temp
return ptr - 成效 :
- Time Complexity : $\color{DB4D6D}{O(n)}$
- Runtime: 21 ms (faster than 67.51%)
- Memory Usage: 15.26 MB (more than 66.39%)
解答 or 其他優秀寫法
- 想法 : 改用 Recursion 之寫法,概念上與我的寫法相同,但在兩個指標 shifting 的部分改用 Recursion 去處理
- 程式碼 :
1
2
3
4
5
6
7
8
9
10
11def reverse(self, qtr, ptr = None):
if not qtr: return ptr
temp = qtr.next # Step 1
qtr.next = ptr # Step 2
return self.reverse(temp, qtr) # 做 shifting (Step 3、4)
def reverseList(self, head):
return self.reverse(head) - 成效 :
- Time Complexity : $\color{DB4D6D}{O(n)}$
- Runtime: 17 ms (faster than 85.76%)
- Memory Usage: 19.54 MB (more than 7.16%)
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Robin's Tech Blog!


