LSGO——LeetCode實戰(鏈表系列):237題 反轉鏈表(Reverse Linked List)

原題:

 

反轉一個單鏈表。

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題?

解法一(迭代):

本來想寫遞歸的,結果寫着寫着程序變成了迭代。

思路:首先我們看到反轉鏈表,最後其實就是將箭頭方向變換爲反方向。也就是說原理的尾節點變成了首節點。由於單鏈表無法向前搜索,所以我們先創建一個輔助鏈表。本程序我把head作爲了輔助鏈表,將原鏈表賦給pro。pro指向的是我們即將變換的節點。

接下來一步就是變換next,我們假設head是前m個節點且已經反轉完畢的鏈表,我用pro記錄還未反轉的鏈表,之後我用ans先記錄剛剛pro位置,pro繼續向後遍歷。將已經反轉的鏈表表頭head賦給ans.next。ans再賦給head,完成一個新的反轉完畢的鏈表,此時,前pro個節點反轉完畢。

最後,當剩餘最後一個還未反轉(一個節點無需反轉),直接將這個節點連接上head。此時整個鏈表反轉完畢。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head:
            pro = head.next
            if pro == None:
                return head
            head.next = None
        else:
            return head
        while pro.next != None:
            ans = pro
            pro = pro.next
            ans.next  = head
            head = ans
        pro.next =head
        return pro

解法二(遞歸法):

我一開始沒有寫對,遞歸法只寫對了一點,對鏈表的認識可能還是有點欠缺(手動狗頭)。

遞歸,我唯一的感悟就是把self.reverseList(head.next)看做一個已經反轉完成的鏈表(也就是說遞歸函數就是我們已經完成的操作結果),之後代入這個操作結果去完成其他的數據處理。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head == None or head.next is None:
            return head
        p = self.reverseList(head.next);
        head.next.next = head
        head.next = None
        return p

            
            
        
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章