1. 程式人生 > >Leetcode 206:反轉連結串列(最詳細解決方案!!!)

Leetcode 206:反轉連結串列(最詳細解決方案!!!)

反轉一個單鏈表。

示例:

輸入: 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 = curcur = latlat = 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

如有問題,希望大家指出!!!