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 {
//     if m == n {
//         return head
//     }
//     dumny := &ListNode{Next:head}
//     p := dumny
//     i := 0
//     for i < m-1{
//         i++
//         p = p.Next
//     }
    
//     var next *ListNode
//     var f func(head *ListNode,m int,n int) *ListNode
//     f = func(head *ListNode,m int,n int) *ListNode {
//         if n == m {
//             next = head.Next
//             return head
//         }
        
//         last := f(head.Next,m,n-1)
//         head.Next.Next = head
//         head.Next = next
//         return last
//     }
    
//     p.Next = f(p.Next,m,n)
    
//     return dumny.Next
// }

var successor *ListNode
//先实现反转链表的前N的节点的函数
func reverseN(head *ListNode,n int) *ListNode { 
	if n == 1 {
		successor = head.Next
        return head
	}

	last := reverseN(head.Next,n-1)
	head.Next.Next = head
	head.Next = successor
	return last
}

//将指定区间的反转转换为 前N个节点的函数
func reverseBetween(head *ListNode, m, n int) *ListNode {
	if m == 1 {
		return reverseN(head,n)
	}
	head.Next = reverseBetween(head.Next , m-1, n-1)
	
	return head
}