典型的三指针反转链表的题目
不多说了,都写在注释里了
# 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.next == None or m == n:
return head
faker = ListNode('skt')
faker.next = head
index = 0
cur = faker
while index < m - 1:
index += 1
cur = cur.next
# index == m - 1
# cur = 反转之前的那个节点
forward = cur
cur = cur.next#第m个,待反转部分反转前的第一个节点
index += 1#index == m
# 如果反转部分只有2个数
# 即forward->a(cur)->b->after_part
# 需forward->b ->a->after_part
# after_part = forward.next.next
# forward.next = cur.next
# forward.next.next = cur
# cur.next = after_part
if m == n - 1:
after_part = cur.next.next#None
forward.next = cur.next#
forward.next.next = cur
cur.next = after_part
return faker.next
# m < n - 1,反转部分至少有三个数,三指针
# 记录第一个cur为newtail
newtail = cur#1
nex = cur.next#2
nexnex = nex.next#3
#after_part = nexnex.next
index += 2#index -> 4
# 先将index += 2,使之为三指针中的最后一个位置
# 当index<=n的时候,不断执行下面的操作
# forward a ->b ->c ->d ->after_part
# cur nex nexnex
# nex.next = cur
# forward a <-b c-> d-> after_part
# cur nex nexnex
# cur = nex
# nex = nexnex
# nexnex = nexnex.next
# forward a <-b c-> d-> after_part
# cur nex nexnex
# index += 1#保证此时index仍然指向nexnex
while index <= n:
nex.next = cur#nex.next = 2
cur = nex#cur = 3
nex = nexnex#nex = 4
nexnex = nexnex.next
index += 1
after_part = nexnex
#直到
# forward a(newtail) <-b <-c d ->after_part
# cur nex nexnex(index)
forward.next = nex
nex.next = cur
newtail.next = after_part
return faker.next