给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
你应该保留两部分内链表节点原有的相对顺序。
样例
给定链表 1->4->3->2->5->2->null,并且 x=3
返回 1->2->2->4->3->5->null
链表拆分
根据与x的大小不同分别插入到两个链表里,然后把两个链表合并。简单的写法是新建链表节点,效率稍低,直接操作指针也可,注意细心别出错即可。
这种方法的一个缺点是:当x出现多次而且时会出错,这道题应该是假设x只出现一次。当x出现多次时,如果要求这些x在链表中是相连的话,那就用三个链表来做,把相等的时候放入另外一个链表,然后处理完之后再链接起来。
ListNode * partition(ListNode * head, int x) {
if(head==NULL) //如果是空链表,返回空
return NULL;
ListNode *small=new ListNode(0); //小列表的假表头
//这个假表头应该是实体,因为操作的是它的next,如果本身就是空的,那么操作next就会出错。
ListNode *small_back; //最后一节点
ListNode *big=new ListNode(0); //大列表的假表头
ListNode *big_back; //最后一个节点
ListNode *tmp=NULL;
while(head)
{
tmp=head;
head=head->next; //HEAD被tmp接管,head后移
tmp->next=NULL;
if(tmp->val<x)
{
if(!small->next) //还是空的
{
small->next=tmp; //第一个接上来
small_back=small->next; //后移
}
else
{
small_back->next=tmp;
small_back=small_back->next;
}
}
else
{
if(!big->next)
{
big->next=tmp;
big_back=big->next;
}
else
{
big_back->next=tmp;
big_back=big_back->next;
}
}
}
if(!small->next) return big->next;
//这里的判断一定要写next,新建假表头一切以假表头为准,一开始忘记写next怎么也通不过,气死!
if(!big->next) return small->next;
small_back->next=big->next;
return small->next;
// write your code here
}