本题源自LeetCode
------------------------------------------------------------
例如:
Given1->4->3->2->5->2and x = 3,
return1->2->2->4->3->5.
思路:先找到第一个大于或者等于给定值的节点p,然后将之后小于给定值的节点按顺序插入到p前面。
代码 :
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; //保持链表不断
while(p){
if(p->val<x){
q->next=p->next; //保证链表不断,将p 插入到pre的后面
p->next=pre->next;
pre->next=p;
pre=p;
p=q;
}
q=p;
p=p->next;
}
return root->next;
}
思路2:
新建俩个链表,一个存放小于x的节点,另一个存放大于等于x的节点。最后将链表和在一起。就得到结果
代码:
ListNode *partition(ListNode *head, int x) {
ListNode* root1=new ListNode(0);
ListNode* q1=root1;
ListNode* root2=new ListNode(0);
ListNode*q2=root2;
ListNode* p=head;
while(p){
if(p->val<x){
q1->next=p;
q1=q1->next;
}else{
q2->next=p;
q2=q2->next;
}
p=p->next;
}
q2->next=NULL; //如果链表的最后一个元素小于X则q2的最后一个元素不为空,必须置空
q1->next=root2->next;
return root1->next;
}