/**

  • struct ListNode {
  • int val;
  • struct ListNode *next;
  • }; */

class Solution { public: /** * * @param head ListNode类 * @param m int整型 * @param n int整型 * @return ListNode类 / ListNode reverseBetween(ListNode* head, int m, int n) { // write code here ListNode* pHead=head;//保证在链表头部的时候不会是空指针 ListNode* pend;//要反转的右边的那个元素的指针

    ListNode* nex;
    ListNode* pHeadp = new ListNode(0);//如果一开始就指向的是头节点,那么当出现{1,2,3,4,5},1,5这个例子的时候,就会导致,最后的一个链表是一个
                          //无线循环链表,所以算法还是得要先修改
    ListNode* pende;
    ListNode* tem = head;
    //考虑到有两种情况,一个是当m==1的时候,一个是当m!=1的时候
    ListNode*s = new ListNode(1);//注意这里的新建立的节点必须要给定一个值,不然在调用->next的时候会导致无限循环
    //接下来是根据m,n的值来建立对应的四个指针的值
    for(int  i =0;i<m-1;++i)
    {
       pHead = tem->next;
        //这里要用到的是head=head->next
        //不然总是会出现
       tem = tem->next;//注意这里不能是这么赋值,要先把原始的值赋给指针,再将指针递增。
    }//找到要反转左边元素的指针
    tem = head;//这里需要重置以下
    for(int  i =0;i<m-1;++i)
    {
       pHeadp = tem;
         tem= tem->next;
    }//找到左边反转元素的前面一个指针
    tem = head;//同理
    for(int i =0;i<n-1;++i)
    {
      pend = tem->next;
          tem= tem->next;
    }//找到反转的右边的元素的指针
    tem = head;//同理
    for(int i =0;i<n;++i)
    {
       pende = tem->next;
          tem= tem->next;
    }//找到有边元素后面对应的指针
     ListNode * pre = pende;//记录连接到指定区域元素的后一位
     
    while(pHead!=pende)
    {
        nex = pHead->next;
        pHead->next = pre;
        pre = pHead;
        pHead = nex;
                  
    }//进行反转元素的算法,方法是根据前面的第一道题目的反转直接摘抄的 
    pHeadp->next = pre;//记录链接到指定区域元素的最开始的那位
    if(m==1)   //这里当最前面的元素需要考虑的时候,需要返回一个指针
    {
      s=pre;
    }
    else //当最前面的元素不需要反转的时候,反转返回的指针就只要返回原来的指针,只不过后面					//不过是的地址发生了变换。
    {
        s=head;
    }
    return s;//这里需要返回以下
    
    
}

};