题目描述(来源)
现有一链表的头指针 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;
}