首先搞清楚几个问题。
1、如果链表为空,返回空。
2、如果链表中根本没有x,怎么办?那么就把链表中比x小的数放到第一个比x大的数的前面。
3、反正最后的链表就是两部分:比x小的数全部在前部分,相对顺序不变;>=x的数在后半部分,相对位置不变。
那么就可以采用一次遍历,先各自建一个链表,然后把这两种数提出来,用尾插法放到各自链表中,最后把两个链表连接起来即可。
struct ListNode* partition(struct ListNode* head, int x ) {
   if(head == NULL)
      return NULL;   //空结点直接返回
   struct ListNode* small = malloc(sizeof(struct ListNode));  //小数虚头结点
   small->next = NULL;  //头结点指针域置空
   struct ListNode* shead = small;  //小数链表头指针
   struct ListNode* srear = small;  //小数链表尾指针,用于尾插法
   struct ListNode* large = malloc(sizeof(struct ListNode));  //大数链表类似
   large->next = NULL;
   struct ListNode* lhead = large;
   struct ListNode* lrear = large;
   struct ListNode* p = head;   //工作结点
   while(p != NULL){
       if(p->val < x){  //比x小的数用尾插法插入小数链表
           srear->next = p;  
           srear = p;
       }
       else{   //>=x的数用尾插法插入大数链表
           lrear->next = p;
           lrear = p;
       }
       p = p->next;  //工作结点后移一位
   }
   lrear->next = NULL;  //大链表尾指针域置空
   srear->next = lhead->next;  //链接两表,注意连接的是大数链表虚头结点的后继
   return shead->next;  //返回小数链表虚头结点的后继
}