链表内指定区间反转
拟人算法系列文章,以容易理解的方式描述算法,点赞收藏不迷路
class ListNode:
def __init__(self, x, next=None):
self.val = x
self.next = next
class Solution:
def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
dummy = ListNode(0)
dummy.next = head
pre = dummy
cur = head
for _ in range(m - 1):
pre = cur
cur = cur.next
for _ in range(m, n):
temp = cur.next
cur.next = temp.next
temp.next = pre.next
pre.next = temp
return dummy.next
if __name__ == "__main__":
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
node5 = ListNode(5)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
s = Solution()
head = s.reverseBetween(node1, 2, 4)
cur = head
while cur:
print(cur.val)
cur = cur.next
好比一个人先带一个小弟站在自己左边,首先这个人定位到要反转的位置,然后再派另一个小弟到自己右边,现在自己指向右边小弟的下一个节点,右边小弟指向老大,左边小弟又指向右边小弟,于是最终结果变成了左边小弟指向右边小弟,右边小弟指向老大,该过程有一点像插入排序的过程