反转链表II

题目描述:给你单链表的头指针head和两个整数left和right,其中left<=right。请你反转从位置left到位置right的链表节点,返回反转后的链表。
示例:
图片说明
输入:head = [1,2,3,4,5],left = 2,right = 4
输出:result [1,4,3,2,5]

采用一趟扫描的解决思路

(1)分析:首先链表是单向链表,由于是单项链表我们就必须记录当前操作节点前一个节点,由于要进行一趟扫描,而且要进行反转,我们还要设一个变量记录当前操作节点的后一个节点。
(2)实现步骤:
第一步:首先找到操作节点,根据left值,设置一个while循环进行查找第一个要操作的节点。
第二步:根据找到的节点进行反转需要反转的链表。
第三步:连接剩下的节点。
(3)步骤演示图:
图片说明
图片说明
图片说明
(3)代码实现

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next


class Solution:
    def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
        head1 = ListNode()
        head1.next = head
        head2 = head1
        l = 1
        temp = head
        while l < left:
            head2 = temp
            temp = temp.next
            l += 1
        head2.next = None
        '''
        此时的head2指向前一个点
        temp 指向当前反转的第一个点
        '''
        # head3 = ListNode()
        head3 = temp
        temp1 = None
        temp2 = temp.next
        # head3.next = None
        while l <= right:
            temp2 = temp.next
            temp.next = temp1
            temp1 = temp
            temp = temp2
            if not temp2:
                temp2 = None
            else:
                temp2 = temp2.next
            temp2 = temp2.next
            l += 1

        head3.next = temp
        head2.next = temp1
        return head1.next