题目
https://leetcode-cn.com/problems/reverse-linked-list-ii/
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明: 1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
程序

因为有可能反转第一个节点,所以创建一个哨兵节点 0
在反转的过程中,我们需要保存几个重要的指针,分别是:
- 第一个反转点的上一个指针(记作:interrupts_node),如上面的1,这个指针最终要指向反转后的第一个指针,如上面的4
- 第一个反转点的指针(记作: first_reverse_node),如上面的2,这个指针最终要指向最后一个反转指针的下一个指针,如上面的5
# 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 not head:return Nonedummy = ListNode(0)dummy.next = headflag_p = dummy # 标志指针,帮助我们来找到要开始反转的那个节点的上一个节点pos = 0 # 位置,记录当前走到哪个位置while flag_p:# 判断当前的位置是不是位置 m 的上一个位置# 是的话if pos == m - 1:interrupts_node = flag_p # 最终 interrupts_node 节点的 next 节点是反转区间的最后一个reverse_node = flag_p.next # 要反转的开始节点sub_cur = None # 子first_reverse_node = flag_p.next # 第一个反转点的指针 first_reverse_node,这个指针最终要指向最后一个反转指针的下一个指针while pos < n: # 如果当前位置在 小于位置 n,那么说明需要反转该节点# 下面就是常规的链表反转node = reverse_node.next #reverse_node.next = sub_cursub_cur = reverse_nodereverse_node = nodepos += 1# 两个关键的指针需要指向正确的位置interrupts_node.next = sub_curfirst_reverse_node.next = nodebreak# 不是的话往下走flag_p = flag_p.nextpos += 1return dummy.next
