题目:
分析:
方法(1):遍历一次
先用x构建两个头节点first和second,遍历原链表然后遇到小于x的就尾插在first后面,遇到大于等于x的就尾插在second后面(即现在有两个独立的链表),当原链表的节点遍历完之后, 将first的尾与second的头连起来(注意找去掉我们当初构建的x节点),并且将second的next域置空,因为它现在是真实的尾节点,最后返回first的下一个节点(因为它是除过我们当时构建的x节点的头节点)
ListNode* partition(ListNode* pHead, int x) {
// write code here
//以x建立一个节点,遍历原链表,小于x的尾插在x前面,大于等于x的尾插在x后面
if(pHead==nullptr)
return nullptr;
ListNode* first=new ListNode(x);
ListNode* second=new ListNode(x);
ListNode* l1=first;//保存小于x的头
ListNode* l2=second;//保存大于0的头
ListNode* cur=pHead;
while(cur)
{
if(cur->val<x)//尾插在前半段
{
first->next=cur;
first=cur;//因为每次要尾插,因此挪动first
}
else//尾插在后半段
{
second->next=cur;
second=cur;
}
cur=cur->next;
}
first->next=l2->next;//前半段的尾连在后半段的头(注意要跳过我们用x构建的节点)
second->next=nullptr;//将最后一个节点的next指针域置为空
return l1->next;//返回真实的头
}
方法(2):遍历二次
构建一个新头,遍历第一次尾插小于x的节点,遍历第二次尾插大于等于x的节点