package main

import (
	. "nc_tools"
)

/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head ListNode类
 * @param m int整型
 * @param n int整型
 * @return ListNode类
 */
func reverseBetween( head *ListNode ,  m int ,  n int ) *ListNode {
    // write code here
    dummy := &ListNode{
        Next: head,
    }

    length := n-m+1

    p,q := dummy,head
    for m > 1 {
        p = p.Next
        q = q.Next
        m--
    }
    pre,cur := reverse(q,length)
    p.Next.Next = cur
    p.Next = pre

    return dummy.Next
}

func reverse(head *ListNode,n int) (*ListNode,*ListNode) {
    var pre,cur *ListNode = nil,head
    for n > 0 {
        n--
        nxt := cur.Next
        cur.Next = pre 
        pre = cur
        cur = nxt
    }
    return pre,cur
}