题目大意:给出一个链表和一个基准元素,将该链表划分为两部分使得前部分元素都小于基准元素,后部分元素都大于或等于基准元素。
算法思想:
1.遍历链表,将小于基准元素的节点连接起来。同时将大于基准元素的节点连接起来。
2.最后将两部分链表连接起来返回。
3.需注意三种情况。(1)所有元素都小于基准元素(2)所有元素都大于基准元素(3)既存在小于基准元素,又存在大于基准元素。
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if(head==NULL) return NULL;
ListNode *p=head,*left=NULL,*right=NULL,*lp=NULL,*rp=NULL;
bool isLhead=true,isRhead=true;
while(p!=NULL){
if(p->val<x){
if(isLhead){
isLhead=false;
left=p;
lp=p;
}
else{
lp->next=p;
lp=lp->next;
}
}
else{
if(isRhead){
isRhead=false;
right=p;
rp=p;
}
else{
rp->next=p;
rp=rp->next;
}
}
p=p->next;
}
if(left!=NULL&&right==NULL)
{
lp->next=NULL;
return left;
}
if(left==NULL&&right!=NULL){
rp->next=NULL;
return right;
}
lp->next=right;
rp->next=NULL;
return left;
}
};