题目描述
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
//试来试去,只有重新建立一个链表的方法比较快O(n)
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
if(pHead==nullptr||pHead->next==nullptr) return pHead;
ListNode *ans=new ListNode(0);
ListNode *p=ans;
ListNode *q=pHead;
//如果要调换小于x、大于x、等于x的顺序那么可以调整下面三者循环的顺序
while(q!=nullptr)
{
if(q->val<x)
{
ListNode *temp=new ListNode(q->val);
p->next=temp;
p=temp;
}
q=q->next;
}
q=pHead;
while(q!=nullptr)
{
if(q->val>x)
{
ListNode *temp=new ListNode(q->val);
p->next=temp;
p=temp;
}
q=q->next;
}
q=pHead;
while(q!=nullptr)
{
if(q->val==x)
{
ListNode *temp=new ListNode(q->val);
p->next=temp;
p=temp;
}
q=q->next;
}
return ans->next;
}
};