题目大意:给出链表,将其中所有小于指定元素x的所有结点移动到大于等于x的节点之前
分析:链表考察。指定两个指针分别指向大于等于x的元素(指针p)和这个元素的前驱(指针pre),遍历p之后的所有结点,将小于x的结点插入到pre的后面。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if(!head) return NULL;
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* pre = dummy;
ListNode* p = pre->next;
while(p && p->val < x){
pre = pre->next;
p = p->next;
} //找到第一个≥x的结点p,同时维护它的pre结点(后续找到比x小的结点往pre后插)
while(p && p->next){ //开始找p之后比x小的结点
ListNode* tmp = p->next;
if(tmp->val < x){
p->next = tmp->next;
tmp->next = pre->next;
pre->next = tmp;
pre = pre->next;
}
else p = p->next;
}
return dummy->next;
}
};