leetcode 練習–反轉鏈表
最近開始學習數據結構和演算法的學習,也自然開始在 leetcode 上練習,所以每周大概會分享做過的leetcode 練習,盡量做到每天更新一道題目。
作為 leetcode 練習筆記的第一道題目,選擇了一道很經典的題目,反轉鏈表。這是 leetcode 上的 206 題,鏈接如下:
//leetcode-cn.com/problems/reverse-linked-list/
示例
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
思路
反轉一個單鏈表,首先肯定需要遍歷這個單鏈表,在遍歷的時候就希望修改當前結點的 next
指針,指向其前一個結點,因此肯定需要一個保存前一個結點的變數,也就是反轉後鏈表的頭部指針。
實現的思路應該是這樣的:
-
首先定義一個 prev
保存前一個結點,curr
保存當前結點,然後還有一個nxt
保存下一個結點,其中prev
就是最終的反轉鏈表的頭結點; -
先讓 nxt
保存下一個結點; -
然後改變 curr
的next
指針,指向前一個結點,即prev
; -
接著,讓 prev = curr
; -
最後,就是讓 curr = nxt
,指向下一個結點 -
重複 2-5 步,直到當前結點為空。
下圖展示了上述幾個步驟的過程:


實現
利用 python 的特性,實現的時候關鍵程式碼其實就一行即可。
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
pre, cur = None, head
while cur:
pre, pre.next, cur = cur, pre, cur.next
return pre
github地址:
//github.com/ccc013/DataStructe-Algorithms_Study/blob/master/Python/Leetcodes/linked_list/206_Reverse_Linked_List.py