给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3 输出: 1->2->2->4->3->5
这里找到第一个大于x的值并保存位置,之后向后查找,直到找到小于x的值并 插入前面找到大于x值并保存的位置,遍历结束为止
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode* root=new ListNode(0);
ListNode* pre=root; //指向第一个大于或者等于x的节点前一个节点
ListNode* p=head;
root->next=head;
while(p&&p->val<x){
pre=p;
p=p->next;
}
ListNode* q=pre; //保持链表不断,这里从p开始找小于x的值并且插到pre的前面
while(p){
if(p->val<x){
q->next=p->next;
p->next=pre->next;
pre->next=p;
pre=p;
p=q;
}
q=p;
p=p->next;
}
return root->next;
}
};