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

链表内指定区间反转

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

idea是非常简单的

我们先找到反转前的第一个节点:before_start ,然后从第一个节点开始反转。

反转结束后将before_start的下一个节点指向反转结束后紧跟着的那个节点。

并将before_start指向需要反转的尾节点。

因为m=1的时候,before_start应该在head之前,所以不妨设计一个哑节点来指向链表的头。

同时,在反转结束后,head指向的节点也不是链表的头部,所以这时要返回before_start.next,因为before_start.next被设置为指向反转的尾节点,这尾节点就是现在的链表的头。

 class Solution:
def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
    # write code here
    if head ==None or head.next == None or n-m==0:
        return head

    pre=None
    before_start = ListNode(0)
    before_start.next = head
    for i in range(0,m-1):
        before_start = before_start.next    #记录反转前的那个      
    cur = before_start.next  #需要反转的第一个
    for _ in range(n-m+1):
        tmp = cur.next
        cur.next = pre
        pre = cur
        cur = tmp
        
    before_start.next.next = cur  #开始的节点指向反转范围之后的那一点
    before_start.next = pre       #开始之间的节点指向反转范围的最后一点
    if m==1:
        return before_start.next  #m=1时需要用before_start.next来找第一个节点
    return head
全部评论

相关推荐

06-12 16:23
已编辑
小米_软件开发(准入职员工)
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

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