題目
給定一個單鏈表的頭節點 head ,請實現反轉鏈表,並返回反轉後的鏈表。
例如:
原鏈表轉換爲列表:[1, 2, 3, 4, 5]
最終的鏈表轉換爲列表:[5, 4, 3, 2, 1]原鏈表轉換爲列表:[1, 2]
最終的鏈表轉換爲列表:[2, 1]原鏈表轉換爲列表:[]
最終的鏈表轉換爲列表:[]
已知 鏈表節點的定義、鏈表與列表相互轉換 的代碼如下:
class ListNode: # 單鏈表
def __init__(self, val=0, next=None):
self.val = val # 鏈表節點上存儲的元素
self.next = next # 指向下一個鏈表節點
def list_to_list_node(numbers): # 將列表轉換爲單向鏈表,並返回鏈表的頭節點
dummy_head = ListNode(0)
pre = dummy_head
for number in numbers:
pre.next = ListNode(number)
pre = pre.next
pre = dummy_head.next
return pre
def list_node_to_list(node): # 將單向鏈表轉換爲列表
result = []
while node:
result.append(node.val)
node = node.next
return result
實現思路
- 設置兩個指針:cur、pre,分別指向當前節點和前一個節點,cur默認指向鏈表頭節點head,pre默認爲None
- 當 cur 非空時進行循環,我們要實現鏈表的反轉,只需要在每次循環過程中讓 cur 指向 pre ,這樣操作下來就能讓當前節點指向其前一個節點
- 循環結束後得到的就是反轉後的鏈表,注意此時 pre 指向原鏈表中的最後一個節點,我們只需要把 pre 返回即可
代碼實現--迭代
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
cur = head # 當前節點
pre = None # 前一個節點
while cur is not None:
tmp_node = cur.next # 臨時保存當前節點的下一個節點 cur.next , 下一步要改變 cur.next
cur.next = pre # 反轉, 當前節點通過 next 指向前一個節點
pre = cur # 將前一個節點變爲當前節點
cur = tmp_node # 將當前節點變爲保存的臨時節點
return pre
上面代碼中使用了一箇中間變量 tmp_node ,其實我們可以直接利用Python的多元賦值來完成,從而使代碼更加簡潔。優化如下:
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
cur, pre = head, None # 當前節點,前一個節點
while cur is not None:
# 當前節點通過 next 指向前一個節點,將前一個節點變爲當前節點,將當前節點變爲下一個節點
cur.next, pre, cur = pre, cur, cur.next
return pre
代碼實現--遞歸
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
return self.reverse_recursive(None, head)
def reverse_recursive(self, pre: ListNode, cur: ListNode) -> ListNode:
if cur is None:
return pre
tmp_node = cur.next # 臨時保存當前節點的下一個節點 cur.next , 下一步要改變 cur.next
cur.next = pre # 反轉,當前節點通過 next 指向前一個節點
return self.reverse_recursive(cur, tmp_node)
更多Python編程題,等你來挑戰:Python編程題彙總(持續更新中……)