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

链表内指定区间反转

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

首先需要找到第 m-1 和第 n+1 节点,分别用 start 和 end 保存

m - 1表示:开始反转的前一个节点,注意如果m = 1,那么从head节点就开始反转了,start就是null n + 1表示:结束反转的后一个节点,可能是一个节点,也可能是null,不过都一样

第一个for循环就是寻找 start 和 end

接下来的while循环里,需要三个指针,pre,cur,next去记录每次循环的节点,然后通过 cur.next = pre 实现反转。这里需要对 m === 1 分开讨论

/**
  * 
  * @param head ListNode类 
  * @param m int整型 
  * @param n int整型 
  * @return ListNode类
  */
function reverseBetween( head ,  m ,  n ) {
    // 如果m === n,则不需要翻转
    if(m === n){
        return head
    }
    // 如果只有一个节点也不需要翻转
    if(head == null || head.next == null){
        return head
    }
    // start指向开始反转节点的前一个节点, 即 m - 1
    // end指向 n + 1
    let cur = head
    let start = null
    let end = null
    
    // 寻找start和end
    for(let i = 1; i <= n; i++){
        if(i === m - 1){
            start = cur
        }
        cur = cur.next
    }
    end = cur
    
  	let pre = null
  	let next = null
    // 如果起始节点不是头节点,说明start有值
    if(m > 1){
        cur = start.next
        while(cur !== end){
            next = cur.next
            cur.next = pre
            pre = cur
            cur = next
        }
        start.next.next = end
        start.next = pre
    } else { // 起始节点就是头节点,start没有值
        cur = head
        while(cur !== end){
            next = cur.next
            cur.next = pre
            pre = cur
            cur = next
        }
        head.next = end
        head = pre
    }
    
    return head
}
全部评论

相关推荐

像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
10-25 12:05
已编辑
湖南科技大学 Java
若梦难了:我有你这简历,已经大厂乱杀了
点赞 评论 收藏
分享
7 2 评论
分享
牛客网
牛客企业服务