反轉從位置 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