题目描述
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。
示例1:
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
示例2:
输入:head = [2,1], x = 2
输出:[1,2]
思路
1、创建两个空的链表,less_head和greater_head指向开辟两个哨兵位的头结点。
2、同时定义一个less_tail和greater_tail用来始终指向这两个链表的尾部,方便尾插
3、遍历原链表,将小于特定值x的节点尾插到less_head链表,将大于等于特定值x的节点尾插到greater_head链表
4、将less_head链表和greater_head链表链接到一起
5、然后将链接后的链表的尾节点的next置为NULL,防止成环
6、最后释放两个哨兵位的头结点并返回链接后的链表
代码实现
struct ListNode
{
int val;
struct ListNode* next;
};
struct ListNode* partition(struct ListNode* head, int x)
{
// 开辟两个哨兵位的头结点,方便尾插
struct ListNode* less_head, * less_tail, * greater_head, * greater_tail;
less_head = less_tail = (struct ListNode*)malloc(sizeof(struct ListNode));
less_tail->next = NULL;
greater_head = greater_tail = (struct ListNode*)malloc(sizeof(struct ListNode));
greater_tail->next = NULL;
struct ListNode* cur = head;
while (cur)
{
// 小于特定值x时尾插到less_head
if (cur->val < x)
{
less_tail->next = cur;
less_tail = cur;
}
// 大于等于特定值x时尾插到greater_head
else
{
greater_tail->next = cur;
greater_tail = cur;
}
cur = cur->next;
}
// 将less_head链接到greater_head
less_tail->next = greater_head->next;
// 将链接后新的链表的尾节点的next置为NULL,防止成环
greater_tail->next = NULL;
// 用newhead记录操作完成的链表的第一个节点
struct ListNode* newhead = less_head->next;
// 释放两个哨兵位的头结点
free(less_head);
free(greater_head);
return newhead;
}