给你一个链表和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入:head = 1->4->3->2->5->2, x = 3
输出:1->2->2->4->3->5
基本思路:采用尾插法,凡是小于x的都尾插到xptr的后面,保证其相对顺序不变
- 使用哨兵标记头节点,遇到cur小于x时,插入xptr后面,并用pre保持大于x的序列的连贯性
ListNode* partition(ListNode* head, int x) {
if(head==nullptr)
return head;
ListNode *DummyHead=new ListNode(-1);
ListNode *xptr=DummyHead,*pre=nullptr; //xptr指向小于x的尾节点,pre用于指向大于x的序列的尾节点,
xptr->next=head;
ListNode *cur=head;
while(cur!=nullptr){
if(cur->val<x){
if(xptr->next==cur){ //注意初始时,xptr刚好是小于x的情况
xptr=xptr->next;
cur=cur->next;
continue;
}
ListNode *tmp=cur->next;
cur->next=xptr->next;
xptr->next=cur;
xptr=xptr->next;
if(pre!=nullptr){
pre->next=tmp; //保证大于x的序列的连贯性
}
cur=tmp;
}
else{
pre=cur;
cur=cur->next;
}
}
return DummyHead->next;
}
基本思路:与上述思路相似,不过解耦了小于x的序列,和大于等于x的序列,使代码看起来比较明了
ListNode* partition(ListNode* head, int x) {
if(head==nullptr)
return head;
ListNode *little_head=new ListNode(-1);
ListNode *big_head=new ListNode(-1);
ListNode *p1=little_head,*p2=big_head;
ListNode *cur=head;
while(cur!=nullptr){
if(cur->val<x){
p1->next=cur;
p1=p1->next;
}
else{
p2->next=cur;
p2=p2->next;
}
cur=cur->next;
}
p1->next=big_head->next;
p2->next=nullptr;
return little_head->next;
}