牛客刷题 2 链表内指定区间反转

本文介绍了一种链表区间反转的方法,通过插入头节点简化第一个位置的反转操作,并详细解释了反转过程中各节点的作用及单步操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要将指定区间内的链表整体反过来
做简要说明:
1.为什么要插入头节点:因为在第一个位置进行反转时,后续要用到pre->next,none类型是没有next的,所以得加头节点,上一题只动了current节点,没有用到pre节点的next,所以不要加
2.pre节点在翻转阶段一直停留在被反转部分所以的后一个ListNode上
curr节点一直在被翻转部分的第一个节点上
3:单步操作:
(1)将要反转部分的第一个节点始终移动到队头,即每次往前挪动一个位置
(2)将队头元素的前一个节点移动到队尾。注意,这里要与两个节点的next进行修改,以完成拼接
4:关于存哪些变量:
以向右为先序,依次进行操作,如果动到Listnode的NEXT了,如果后续还需要这个结果(一定需要),进行寄存,总之你要想一下动了之后整个链有没有断掉

class Solution:
    def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
        # write code here
        #初始化头节点
        head_node=ListNode(-1)
        head_node.next=head
        #初始化:curr,pre
        curr=head
        pre=head_node
        #第一段,定位到要进行翻转的位置:
        for i in range(1,m):
            pre=curr
            curr=curr.next
        #第二段开始不停的翻转:
        for i in range(m,n):
            #要被移动到队尾的元素
            temp=curr.next
            #先定新队头
            curr.next=temp.next
            #后定新队尾(2步)
            temp.next=pre.next
            pre.next=temp
        return head_node.next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值