struct ListNode* reverseBetween(struct ListNode* head, int m, int n )
{
    //动态分配内存创建一个哑结点
    struct ListNode* newnode = malloc(sizeof(struct ListNode*));
    if (newnode == NULL) 
    {  
    // 处理内存分配失败的情况  
    return NULL;  
    }  
    newnode->next = head; //将哑结点定义为头结点之前的一个节点
    struct ListNode* Pre =newnode;//创建一个Pre指针和一个Cru指针,都指向哑结点,后续主要操作这两个指针
    struct ListNode* Cru =newnode;
    
    //移动指针对链表进行遍历,从哑结点开始遍历到m(第一个反转节点)的前一个节点,这部分不进行反转。
    for(int i = 0; i < m; i++)
    {
        Pre = Cru;
        Cru = Cru->next;//这两句将Pre指针固定为始终指向Cru指针所指向节点的前一个节点
    }
    
    //对反转部分进行遍历,此时Cru指向第一个反转节点的前一个节点,即Pre->Cru->第一个要反转的节点
    for(int i = 0; i < n - m; i++)
    {
        struct ListNode* next_node = Cru->next; //将第一个要反转的节点暂存到next_node中
        Cru->next = next_node->next; //直接跳过第一个要反转的节点,即Cru的下一个节点原本是第一个要反转的点(next_node),现在指向下下个节点
        next_node->next = Pre->next;//开始反转操作。将第一个要反转的点(next_node)的下一个节点指向Pre的下一个节点,而Pre的下一个节点是Cru,也就是将next_node的下一个节点指向了next_node的前一个节点。此时链表结构变为 “prev -> next_node -> cur ...”
        Pre->next = next_node; //将pre和next_node进行next连接
    }
    return newnode->next; //返回头结点

    


}