/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
      // 空处理
      if (m == n || head == nullptr) {
        return head;
      }

      // 为链表添加一个头节点
      ListNode myHead(0);
      myHead.next = head;

      // 将指针指向第m个数的前一个
      ListNode* it = &myHead;
      for (int i = 1; i < m; i++) {
        it = it->next;
      }

      // it为改变后的链表
      // it2用于保存需要头插的第一个值 将it与it2断开
      ListNode* it2 = it->next;
      it->next = nullptr;

      // temp指向it2头插后剩下的链表
      ListNode* temp;
      // 共有n + 1 - m个数需要反转
      for (int i = m; i <= n; i++) {
        temp = it2->next;
        it2->next = it->next;
        it->next = it2;
        it2 = temp;
      }

      // 利用it3 访问到it的最后一个非空值
      ListNode* it3;
      for (it3 = it; it3->next != nullptr; it3 = it3->next) {
      }
      // 将temp即剩下未改变的链表插入到it中
      it3->next = temp;
      return myHead.next;
    }
};