给你一个链表的头节点 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]
提示:
- 链表中节点的数目在范围
[0, 200]
内 -100 <= Node.val <= 100
-200 <= x <= 200
此题思路: 新建两个链表,一个小于x的链表,一个大于等于x的链表,遍历原链表,将小于x的结点插入到小于x的链表中,将大于等于x的结点插入到大于等于x的链表中,最后将两个链表拼接起来。
在最后要记得将大于等于x的链表的最后一个节点指向空
最后用一个新的指针指向小于x的链表,然后释放小于x的链表和大于等于x的链表。
struct ListNode* partition(struct ListNode* head, int x){
struct ListNode* lessHead = NULL;
struct ListNode* lessTail = NULL;
struct ListNode* greaterHead = NULL;
struct ListNode* greaterTail = NULL;
struct ListNode* cur = head;
//开一个哨兵节点
lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));
lessTail->next = NULL;
greaterHead = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode));
greaterTail->next = NULL;
//遍历链表
while (cur)
{
if (cur->val < x)
{
lessTail->next = cur;
lessTail = lessTail->next;
}
else
{
greaterTail->next = cur;
greaterTail = greaterTail->next;
}
cur = cur->next;
}
//拼接两个链表
lessTail->next = greaterHead->next;
greaterTail->next = NULL;
struct ListNode* p = lessHead->next;
free(lessHead);
free(greaterHead);
return p;
}
测试代码
void test(SLTNode* plist)
{
SLTNode* new_head = partition(plist, 30);
SListPrint(new_head);
}