LeetCode: 反轉鏈表 II python實現

1. 題目描述

92.反轉鏈表 II
        反轉從位置 m 到 n 的鏈表。請使用一趟掃描完成反轉。
說明:
        1 ≤ m ≤ n ≤ 鏈表長度。
示例:
        輸入: 1->2->3->4->5->NULL, m = 2, n = 4
        輸出: 1->4->3->2->5->NULL

2. 代碼實現

整體思路:三個指針,進行插入操作
temp:需要進行翻轉的前一個節點的指針
left:需要進行翻轉的首節點指針
right:需要進行翻轉的節點的尾指針
例如:
1->2->3->4->5->NULL, m = 2, n = 4
        temp爲起始至節點1,left爲節點2及以後,right節點爲3及以後,將節點3插入節點1和節點2之間,
變成: 1->3->2->4->5->NULL
        此時,right變爲節點4及以後,left依然爲節點2及以後,再將節點4插入節點1和節點3之間
變成:1->4->3->2->5->NULL
        實現翻轉的效果!
首先獲得temp:

        temps = ListNode(-1)
        temps.next = head
        temp = temps
        for i in range(m-1):
            # 獲得第m-1個節點
            temp = temp.next

然後獲得left和right:

        left = temp.next
        right = left.next

實現翻轉代碼:

        for j in range(n-m):
            # 步驟1
            left.next = right.next
            # 步驟2
            right.next = temp.next
            # 步驟3
            temp.next = right
            # 步驟4
            right = left.next

翻轉算法的具體實現:
在這裏插入圖片描述
說一下我踩的雷(新手傷不起):
在寫代碼的過程中,將步驟2的代碼寫成了如下所示導致輸出結果爲:[1,4,2,5]

for j in range(n-m):
            # 步驟1
            left.next = right.next
            # 步驟2
            right.next = left
            # 步驟3
            temp.next = right
            # 步驟4
            right = left.next

將數據過一遍就會發現:
第一次循環:1->3->2->4->5->NULL
第二次循環:1->4->2->5->NULL
        第二次循環時,left爲2,right爲4, right.next = left執行後爲4->2,temp.next = right執行後爲1->4。

最後完整的實現代碼爲:

class Solution(object):
    def reverseBetween(self, head, m, n):
        """
        :type head: ListNode
        :type m: int
        :type n: int
        :rtype: ListNode
        """
        temps = ListNode(-1)
        temps.next = head
        temp = temps
        for i in range(m-1):
            # 獲得第m-1個節點
            temp = temp.next
            # right = temp.next
        left = temp.next
        right = left.next
        for j in range(n-m):
            # 步驟1
            left.next = right.next
            # 步驟2
            right.next = temp.next
            # 步驟3
            temp.next = right
            # 步驟4
            right = left.next
        return temps.next
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章