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