题解 | #链表内指定区间反转#

链表内指定区间反转

https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param head ListNode类 
# @param m int整型 
# @param n int整型 
# @return ListNode类
#
class Solution:
    def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
        # 创建一个哑节点,这可以帮助简化插入节点等操作,特别是在链表头部处理时
        dummy_head = ListNode(-1)
        # 将哑节点指向原链表的头部,这样我们就不会丢失头节点的引用
        dummy_head.next = head

        # 使用一个指针从哑节点开始遍历链表,直到达到翻转部分的前一个节点
        pointer = dummy_head
        for i in range(m-1):
            pointer = pointer.next

        # 'reverse_pre'将作为反转部分的前一个节点
        reverse_pre = pointer
        # 'reverse_tail'将是反转部分的第一个节点,翻转后将成为尾部
        reverse_tail = pointer.next

        # 'pre'将跟踪我们即将翻转的节点的前一个节点
        # 'cur'是当前要翻转的节点
        pre = pointer.next
        cur = pre.next

        # 进行翻转操作直到达到指定的位置n
        while m < n:
            # 'temp'用来暂存'cur'的下一个节点,因为翻转过程中会丢失原有的next引用
            temp = cur.next
            # 将'cur'的next指向'pre'来实现翻转
            cur.next = pre
            # 'pre'和'cur'都前进一个节点
            pre = cur
            cur = temp
            # 我们已经处理了一个节点,所以减少n
            m += 1
        
        # 经过上面的循环,翻转部分已经完成,现在将翻转部分前面的节点连接到翻转后的头部
        reverse_pre.next = pre
        # 将翻转部分后的尾部连接到剩余未翻转部分的头部
        reverse_tail.next = cur

        # 因为我们使用了哑节点,所以返回哑节点的next,即原链表的头部
        return dummy_head.next

全部评论

相关推荐

06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
双非有机会进大厂吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务