题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @param m int整型
# @param n int整型
# @return ListNode类
#
class Solution:
def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
# 创建一个哑节点,这可以帮助简化插入节点等操作,特别是在链表头部处理时
dummy_head = ListNode(-1)
# 将哑节点指向原链表的头部,这样我们就不会丢失头节点的引用
dummy_head.next = head
# 使用一个指针从哑节点开始遍历链表,直到达到翻转部分的前一个节点
pointer = dummy_head
for i in range(m-1):
pointer = pointer.next
# 'reverse_pre'将作为反转部分的前一个节点
reverse_pre = pointer
# 'reverse_tail'将是反转部分的第一个节点,翻转后将成为尾部
reverse_tail = pointer.next
# 'pre'将跟踪我们即将翻转的节点的前一个节点
# 'cur'是当前要翻转的节点
pre = pointer.next
cur = pre.next
# 进行翻转操作直到达到指定的位置n
while m < n:
# 'temp'用来暂存'cur'的下一个节点,因为翻转过程中会丢失原有的next引用
temp = cur.next
# 将'cur'的next指向'pre'来实现翻转
cur.next = pre
# 'pre'和'cur'都前进一个节点
pre = cur
cur = temp
# 我们已经处理了一个节点,所以减少n
m += 1
# 经过上面的循环,翻转部分已经完成,现在将翻转部分前面的节点连接到翻转后的头部
reverse_pre.next = pre
# 将翻转部分后的尾部连接到剩余未翻转部分的头部
reverse_tail.next = cur
# 因为我们使用了哑节点,所以返回哑节点的next,即原链表的头部
return dummy_head.next
