先局部反转,再将其与其他部分连接,非常的麻烦!

/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @param m int整型 
 * @param n int整型 
 * @return ListNode类
 */
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
    
    if(!head||!head->next)
        return head;
    
    if(m==n)
        return head;
    
    struct ListNode* p1=head,*p2=head,*p0=head,*pm=head;
    
    //找到要反转的头尾两个节点
    for(int i=1;i<m;i++){
        p0=p1;
        p1=p1->next;
        pm=p1;
    }
    for(int j=1;j<n;j++){
        p2=p2->next;
    }
    
    
    //反转,利用p1,p3,p4三个指针
    struct ListNode*p3=p1->next,*p4=p1->next->next;
    while(p1!=p2){
        p3->next=p1;
        p1=p3;
        p3=p4;
        if(p4)
        p4=p4->next;
    }
    
    //将反转后的部分链表与首尾连接
    p0->next=p1;
    pm->next=p3;
    
    //特殊情况,直接返回p2
    if(m==1)
        return p2;
    
    return head;
}