92. 反转链表 II(中等)

文章介绍了如何使用Python解决LeetCode中的问题,即给定单链表和两个整数,反转从位置left到positionright的链表节点。通过创建哨兵节点、定义反转函数并分步骤操作,实现链表的区间反转。
摘要由CSDN通过智能技术生成

https://leetcode.cn/problems/reverse-linked-list-ii/

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例 1:
在这里插入图片描述
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

class Solution:
    def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
        dummy = ListNode()  # 链表发生变化,最终结果返回整条链,头节点可能会发生变动,所以设立哨兵节点
        dummy.next = head
        p = dummy  # 遍历指针

        # 第1步:构建反转函数,用于反转[left, right]之间的链表,参考 206. 反转链表
        def reverse(head):  
            pre = None
            cur = head
            while cur:
                tmp = cur.next
                cur.next = pre
                pre = cur
                cur = tmp
            return pre
        
        # 第2步:找到反转链表的首尾节点,也就是left与right所在节点
        # 指针遍历,往前走left - 1步,走到left的左侧
        n1 = left - 1
        while n1 > 0:
            p = p.next
            n1 -= 1
    
        # 确定left位置的节点
        left_node = p.next

        # 确定right位置的节点
        n2 = right - left + 1
        right_node = p
        while n2 > 0:
            right_node = right_node.next
            n2 -= 1
        
        # 确定第3段链表的头节点
        third_link_head = right_node.next

        # 第3步:断开left与其左侧的节点,断开right与其右侧的节点
        p.next = None
        right_node.next = None
        
        # 第4步:反转[left, right]之间链表
        reverse(left_node)

        # 第5步:重新连接3段链表并返回
        p.next = right_node
        left_node.next = third_link_head
        return dummy.next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值