题目描述(来源)
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
思路
创建两个链表,遍历一遍传入的链表,将值大于x的结点和值小于x的结点依次尾插到两个链表中,最后再将这两个链表链接起来,并返回第一个结点的位置即可。
1.把小于x的结点尾插到less链表,把大于x的结点尾插到greater链表。
2.将less链表与greater链表链接起来。
typedef struct ListNode
{
int val;
struct ListNode *next;
}ListNode;
ListNode* partition(ListNode* pHead, int x)
{
// 创建两个空链表的头节点以及它们对应的尾节点指针
ListNode* greaterHead, *greaterTail, *lessHead, *lessTail;
// 分别为大于等于x的链表和小于x的链表分配内存空间,并初始化为空链表(头节点的next设为NULL)
greaterHead = greaterTail = (ListNode*)malloc(sizeof(struct ListNode));
lessHead = lessTail = (ListNode*)malloc(sizeof(struct ListNode));
greaterTail->next = lessTail->next = NULL;
// 创建一个指针cur遍历原始链表
ListNode* cur = pHead;
// 遍历整个原始链表
while(cur)
{
// 如果当前节点的值小于x,则将其添加到小于x的链表尾部
if(cur->val < x)
{
lessTail->next = cur;
// 更新小于x链表的尾节点指针
lessTail = lessTail->next;
}
// 否则,将其添加到大于等于x的链表尾部
else
{
greaterTail->next = cur;
// 更新大于等于x链表的尾节点指针
greaterTail = greaterTail->next;
}
// 移动原始链表的指针到下一个节点
cur = cur->next;
}
// 将小于x的链表与大于等于x的链表连接起来,使得小于x的部分在前
lessTail->next = greaterHead->next;
// 确保大于等于x的链表末尾不指向任何节点
greaterTail->next = NULL;
// 获取新链表的头节点,即小于x的链表的实际头节点
ListNode* head = lessHead->next;
// 释放两个空链表头节点的内存,因为它们已经完成了辅助构建新链表的任务
free(greaterHead);
free(lessHead);
// 返回新链表的头节点
return head;
}