思路

定义结构体指针l, r分别标记第m个和第n个节点的位置,然后用结构体指针last和next分别标记第m个节点的上一个节点和第n个节点的下一个节点。然后把r的下一个节点先暂时标记成NULL,把[m,n]这个节点区间进行翻转,当m不等于1的时候把last的下一个节点连接到翻转后的头节点上,把翻转后节点的末节点连接到next节点上。当m等于1的时候直接返回翻转后的头节点就行。

 * 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 ) {
    // write code here
    struct ListNode *l,*r,*last,*next,*ans;
    ans=head;//记录头节点的位置
    next=NULL;
    int k=0;//k用于标记第几个节点
    if(m==1)
        last=NULL;
    while(head)
    {
        ++k;
        if(k==m-1)
            last=head;
        if(k==m)
            l=head;
        if(k==n)
            r=head;
        if(k==n+1)
            next=head;
        head=head->next;
    }
    struct ListNode *fhead,*pHead,*fr;
    r->next=NULL;
    pHead=l;
    pHead=pHead->next;
    fr=pHead;
    l->next=next;//把要翻转的左边的节点的下一个节点指向翻转区间右边节点的下一个节点
    while(pHead)
    {
        pHead=pHead->next;//pHead移动到下一个位置
        fr->next=l;
        l=fr;
        fr=pHead;
    }
  //  return l;
    if(m!=1)
        last->next=l;
    else return l;
    return ans;
}