基本思路:在遍历过程中,用一个指针m指向最后一个小于x的节点,在一个循环中指针p跳过所有大于等于x的节点,将小于x的节点p插到m节点后,同时更新指针p和指针m。
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode *L = new ListNode(0);
L->next = head;
ListNode *m = L, *q = L, *p = head;
while (1){
while (p!=NULL&&p->val >= x){
p = p->next;
q = q->next;
}
if (m != q){
q->next = p->next;
p->next = m->next;
m->next = p;
p = q->next;
m = m->next;
}
else{
q = q->next;
p = p->next;
m = m->next;
}
}
return L->next;
}
};