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; //返回头结点 }