Leetcode 206:反轉連結串列(最詳細解決方案!!!)
阿新 • • 發佈:2019-01-04
反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞迴地反轉連結串列。你能否用兩種方法解決這道題?
解題思路
很經典的問題,首先設定pre,cur,lat
三個指標
pre cur lat
null 1 -> 2 -> 3 -> 4 -> 5 -> null
接著cur.next = pre
pre cur lat null <-1 2 -> 3 -> 4 -> 5 -> null
接著pre = cur
,cur = lat
,lat = lat.next
pre cur lat
null <-1 2 -> 3 -> 4 -> 5 -> null
重複上述操作直到lat=None
。
pre cur lat
null <-1 <- 2 <- 3 <- 4 5 -> null
最後cur.next = pre
即可。
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
pre = None
cur = head
lat = head.next
while lat != None:
cur.next = pre
pre = cur
cur = lat
lat = lat.next
cur.next = pre
return cur
我們再回過頭來看上述程式碼,這個程式碼其實有一個重大的bug
。如果head=None
,那麼lat = cur.next
就會出問題。
其實我們可以這樣寫
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
pre = None
cur = head
while cur != None:
lat = cur.next
cur.next = pre
pre = cur
cur = lat
return pre
這個問題使用遞迴就更簡單了,我們知道reverseList(head)
返回輸入的連結串列反轉後的head
,那麼如果reverseList(head.next)
的話
head
1->2<-3<-4<-5
|
node
我們此時只需要head.next.next=head
,也就是先建立一個雙向連線
head
1->2<-3<-4<-5
<- |
node
然後再head.next=None
,返回node
即可。
head
null<-1<-2<-3<-4<-5
|
node
程式碼如下
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head == None or head.next == None:
return head
node = self.reverseList(head.next)
head.next.next = head
head.next = None
return node
如有問題,希望大家指出!!!