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

链表内指定区间反转

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:
        # write code here
        if not head or m == n:
        #如果链表为空(head is None),直接返回;
        #如果 m == n,说明不需要反转(只涉及一个节点),也直接返回原链表。
            return head

        dummy = ListNode(0)     #创建一个虚拟头结点
        dummy.next = head       #指向原链表头结点

        prev = dummy            
        #这样即使 m == 1(也就是需要从头节点开始反转),
        #我们也能统一用 prev.next 来操作,不需要单独处理头节点变化的特殊情况;

        # 1. 找到第 m-1 个节点
        for _ in range(m - 1):
            prev = prev.next

        # 2. 开始反转 m 到 n 的区间
        cur = prev.next          # 第 m 个节点
        reverse_tail = cur       # 反转后的尾节点(原头节点)
        prev_rev = None          # 反转后的头结点
        for _ in range(n - m + 1):  #反转
            nxt = cur.next       #保留原链表当前节点的下一个节点
            cur.next = prev_rev  #在新链表前插入节点(先插位置)
            prev_rev = cur       #新头节点赋值(再插值)
            cur = nxt            #恢复到原链表的下一个节点

        # 3. 重新连接
        prev.next = prev_rev     # prev_rev 是反转后的新头
        reverse_tail.next = cur  # cur 是 n+1 个节点

        return dummy.next





全部评论

相关推荐

07-22 11:53
门头沟学院 Java
终于有一个保底的offer了,但感觉是白菜价
北凝a:我想问问,提前批的offer 有问你啥时候到岗吗,如果你还想找其他的怎么办
点赞 评论 收藏
分享
Lorn的意义:1.你这根本就不会写简历呀,了解太少了 2.你这些项目经历感觉真的没啥亮点啊,描述的不行,重写书写一下让人看到核心,就继续海投 注意七八月份ofer还是比较多的,越往后机会越少,抓住时机,抓紧检查疏漏,加油查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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