反转链表 II力扣刷题

本文介绍了如何使用Python编程语言中的链表操作,通过Solution类中的reverseBetween方法,找到给定链表的左边界和右边界,然后反转这两个边界之间的链表节点,最后将其与原链表正确连接。
摘要由CSDN通过智能技术生成

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

思路应该清晰:找到左右边界,切断形成子链表,反转该区间的子链表,与原始链表进行链接。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
        # 使用遍历的方式,反转链表的函数,将当前节点和前一个节点进行反转
        def reverse(head):
            # 初始化第一个节点为空
            pre = None
            # 初始化当前节点为头节点
            curr = head
            # 当当前节点非空
            while curr:
                # 临时变量存储当前节点的指针
                temp = curr.next
                # 将当前节点的指针指向前一个节点
                curr.next = pre

                # 将当前节点作为前一个节点
                pre = curr
                # 将当前节点的指针作为当前节点。也就是顺延
                curr = temp
            
        # 创建一个虚拟头节点,这样对于left=1的情况也能统一处理
        dummy = ListNode(0)
        dummy.next = head # 指向头节点
        pre = dummy # 作为最初的前一个节点
        
        # 找到左边界限的前一个节点,也就是往后查看left-1次
        for _ in range(left-1):
            pre = pre.next
        
        # 初始化右边界节点,不断往右走,直到到达右边的界限
        right_node = pre
        for _ in range(right-left+1):
            right_node = right_node.next
        
        # 切出区间链表
        # 左边的节点
        left_node = pre.next
        # 右边的节点的下一个,为了定位最后的剩余区间
        curr = right_node.next

        # 切断原来的链表
        pre.next = None # 修改链表的左边的节点的前一个节点的指针为空
        right_node.next = None # 修改链表的右边的节点的指针为空

        # 反转区间链表,前面已经将区间链表最右边的指针更换为空,所以只会反转该区间
        reverse(left_node)

        # 接回原来的链表
        # 修改链表的左边的节点的前一个节点的指针为区间链表的右边节点
        pre.next = right_node
        # 此时的left_node已经是反转到右边了,所以将其指针指向剩余的右边区间
        left_node.next = curr

        # 返回头节点
        return dummy.next


我们要做的事情 这段代码的目的是反转一个链表中从位置left到位置right之间的部分。链表是一种数据结构,每个元素都是一个节点,每个节点都有一个值和一个指向下一个节点的指针。如果没有下一个节点,这个指针就是空的。

怎么做呢?

  1. 准备阶段: 首先,我们创建了一个假的"头节点"(我们叫它dummy),它的下一个节点指向真正的头节点。这样做的原因是为了方便处理当left等于1,也就是要反转的部分包括了链表的第一个节点的情况。

  2. 找到要反转的部分: 然后,我们找到了要反转的部分的前一个节点和最后一个节点。这是通过移动指针完成的:从假的"头节点"开始,往右移动直到到达left的前一个位置,记下这个位置;然后,从这个位置再往右移动直到到达right的位置。

  3. 切断要反转的部分: 接下来,我们把要反转的部分从链表中"切出来"。我们让左边界的前一个节点的next指针指向None,右边界节点的next指针也指向None。这样,我们就有了一个独立的链表段,只包含要反转的部分。

  4. 反转: 现在,我们使用一个特别的函数reverse来反转这个独立的链表段。这个函数通过不断地改变节点的next指针,让它们指向前一个节点,来达到反转的目的。

  5. 接回原链表: 反转完成后,我们把反转的链表段接回原来的链表中。这是通过修改原来左边界的前一个节点的next指针,让它指向反转后的第一个节点(也就是原来的右边界节点),同时让原来的左边界节点(现在在反转段的末尾)的next指针指向剩下的链表部分来完成的。

  6. 完成! 最后,我们返回假的"头节点"的下一个节点作为新的头节点,因为可能头节点也参与了反转。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵海之森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值