题目描述:给出一个长度为 nn 的单链表和一个值 xx ,单链表的每一个值为 list[i]list[i],请返回一个链表的头结点,要求新链表中小于 x 的节点全部在大于等于 x 的节点左侧,并且两个部分之内的节点之间与原来的链表要保持相对顺序不变。

示例1
       输入:{1,4,3,2,5,2},3
       返回值:{1,2,2,4,3,5}
思路:直接遍历单链表两次,第一次将小于x的节点取出来放到新的单链表中,第二次遍历将大于等于x的节点取出来添加到新单链表后即可。具体代码如下:

/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param x int整型 
     * @return ListNode类
     */
    ListNode* partition(ListNode* head, int x) {
        // write code here
        ListNode *res = (ListNode *)malloc(sizeof(ListNode)),*p=res,*q = head;
        while(q != NULL)
        {
            if(q->val < x)
            {
                ListNode *r = (ListNode *)malloc(sizeof(ListNode));
                r->val = q->val;
                r->next = NULL;
                p->next = r;
                p = p->next;
            }
            q = q->next;
        }
        q = head;
        while(q != NULL)
        {
            if(q->val >= x)
            {
                ListNode *r = (ListNode *)malloc(sizeof(ListNode));
                r->val = q->val;
                r->next = NULL;
                p->next = r;
                p = p->next;
            }
            q = q->next;
        }
        return res->next;
    }
};