原题链接:https://leetcode-cn.com/problems/partition-list/
1、双指针
ListNode* partition(ListNode* head, int x) {
if(head==NULL||head->next==NULL) return head;
ListNode *pre=new ListNode;//设立头结点
pre->next=head;
ListNode *p=pre,*q=head;//p为前指针,q为后指针
while(p->next->val<x&&q->next!=NULL){//将p移动至第一个大于x的节点的前一个节点,同时移动q
p=p->next;
q=q->next;
}
while(q->next!=NULL){
if(q->next->val<x){//当前节点比x小则将该节点进行前移
ListNode *tmp=q->next;
q->next=tmp->next;
tmp->next=p->next;
p->next=tmp;
p=p->next;
}else{
q=q->next;//如果当前节点比x大,则将q指针后移
}
}
return pre->next;
}
2、双链表
示例(来源):
ListNode* partition(ListNode* head, int x) {//用两个链表分别记录比x大和小的节点,然后将两个链表合并即可
ListNode *before=new ListNode;//before用于保存比x小的节点
ListNode *pre_before=before;//pre_before记录before头部
ListNode *after=new ListNode;//after用于保存比x大的节点
ListNode *pre_after=after;//pre_after记录after头部
ListNode *p=head;
while(p!=NULL){
if(p->val<x){//before用于保存比x小的节点
before->next=p;
before=before->next;
}
else{//after用于保存比x大的节点
after->next=p;
after=after->next;
}
p=p->next;
}
before->next=pre_after->next;//合并
after->next=NULL;
return pre_before->next;
}