leetcode 【鏈表反轉II】

反轉從位置 m 到 n 的鏈表。請使用一趟掃描完成反轉。

說明:
1 ≤ m ≤ n ≤ 鏈表長度。

示例:

輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/reverse-linked-list-ii
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

核心部分還是用普通鏈表反轉的三指針法

注意幾個坑點:
首先思路是直接遍歷到第m個節點之前的m-1個節點,並記錄該節點爲pre,用於反轉後接通反轉後區間的新頭結點。

當被反轉的部分包括原鏈表頭指針時,注意要將pre設爲None,作爲標誌,反轉結束後直接將反轉區間的頭結點設爲結果鏈表的新頭結點

設定一個被反轉鏈表部分的第一個節點爲last,表示該位置爲反轉之後的尾指針,該位置用於接入原鏈表的下一個結點

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

class Solution:
    def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
        if head==None or head.next==None or m==n:
            return head
        cnt=1
        tmp=head
        pre=None
        while cnt<m-1:#首先遍歷到被反轉部分的前一個指針
            tmp=tmp.next
            cnt+=1
        if m!=1:
            pre=tmp
            tmp=tmp.next
            cnt+=1
        l=None
        last=tmp
        while cnt<=n:#普通的三支針法反轉鏈表
            r=tmp.next
            tmp.next=l
            l=tmp
            tmp=r
            cnt+=1
        last.next=r
        if pre==None:#若反轉部分包括head,設定pre爲空,設定翻轉後的鏈表作爲整個鏈表的新head
            head=l
        else:#否則將之前記錄的Pre接入反轉後的新頭結點
            pre.next=l
        return head
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章