/*
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;                 //返回低值链表的头节点
    }
};