// 定义一个函数,接受一个链表头节点指针head和两个整数x/y,表示要反转的链表区间为[x, y]
struct Node *rollback_LinkList_range(struct Node *head, Elemtype x, Elemtype y)
{
// 判空,如果链表为空或只有一个节点,或者x大于等于y,则无需反转,直接返回NULL
if (head == NULL || head->next == NULL || x >= y)
{
return NULL;
}
// 找到x的位置,pre指向第x-1个节点,curr指向第x个节点
struct Node *pre = NULL; // 前驱节点指针
struct Node *curr = head; // 当前节点指针
for (int i = 0; i < x - 1; i++)
{
pre = curr;
curr = curr->next;
}
// 使用三个辅助指针,start指向第x个节点,end指向第y个节点的下一个节点,next用于保存curr的下一个节点
struct Node *start = curr; // 区间起始节点指针
struct Node *end = curr; // 区间结束节点指针
struct Node *next = NULL; // 下一个节点指针
// 在区间内反转链表
for (int i = x; i <= y; i++)
{
next = curr->next; // 保存当前节点的下一个节点
curr->next = pre; // 将当前节点的next指针指向前驱节点,实现反转
pre = curr; // 更新前驱节点指针为当前节点
curr = next; // 更新当前节点指针为下一个节点
}
// 将start节点的next指针指向end节点,将第x-1个节点的next指针指向第y个节点
if (start != NULL)
{
start->next = pre;
}
else
{
head = pre; // 如果x为1,更新头节点为反转后的链表头
}
end->next = curr;
return head; // 返回反转后的链表头节点指针
}
区域内反转链表
最新推荐文章于 2024-07-25 17:43:13 发布