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

链表内指定区间反转

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
全部评论

相关推荐

头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
躺尸修仙中:因为很多92的也去卷中小厂,反正投递简历不要钱,面试不要钱,时间冲突就推,不冲突就面试积累经验
点赞 评论 收藏
分享
4 收藏 评论
分享
牛客网
牛客企业服务