问题描述
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
具体思想:找到第一个大于或等于x的数,以它为基准,后面的数如果小于x则移动到基准的前一节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* partition(struct ListNode* head, int x) {
struct ListNode *v=(struct ListNode*)malloc(sizeof(struct ListNode));
v->next=head;
struct ListNode *p=v;
while(p){
if(p->next==NULL){
return v->next;
}
if(p->next->val >= x){
break;
}
p=p->next;
}
struct ListNode *q=p->next;
while(q){
if(q->next==NULL){
break;
}
if(q->next->val < x){
struct ListNode *t=q->next;
q->next=t->next;
t->next=p->next;
p->next=t;
p=p->next;
continue;
}
q=q->next;
}
return v->next;
}