/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} };*/ class Partition { public: ListNode* partition(ListNode* pHead, int x) { int lowcount=0; int highcount=0; ListNode* cur=pHead; while(cur) //判断是否有全小于x或全大于x的情况 { if(cur->val<x) { lowcount++; } else { highcount++; } cur=cur->next; } if((lowcount==0)||(highcount==0)) { return pHead; } ListNode*lowhead=NULL; //创建小于x值的单链表 ListNode*highhead=NULL; //储存尾节点地址 ListNode*lowend=NULL; //创建大于x值的单链表 ListNode*highend=NULL; //储存尾节点的地址 ListNode*tmp=pHead; while(tmp) { if(tmp->val<x) { if(lowhead==NULL) //头结点为空时将小于x值节点的地址赋值给lowhead和lowend { lowhead=lowend=tmp; } else { lowend->next=tmp; //将小于x值节点的地址尾接到lowend的后面 lowend=tmp; //lowend后移一位 } } else { if(highhead==NULL) //头结点为空时将大于x值节点的地址赋值给highhead和highend { highhead=highend=tmp; } else { highend->next=tmp; //将不小于x值节点的地址尾接到highend的后面 highend=tmp; //highend后移一位 } } tmp=tmp->next; } highend->next=NULL; //将高值链表尾节点的next置空 lowend->next=highhead; //链接高值链表和低值链表 return lowhead; //返回低值链表的头节点 } };