题目:
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2
and x = 3,
return 1->2->2->4->3->5
.
<pre name="code" class="cpp">class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if (NULL == head || NULL == head->next) return head;
ListNode *p = head;
ListNode *pHeadFirst = NULL, *pHeadSecond = NULL;
ListNode *pTailFirst = NULL, *pTailSecond = NULL;
while (p != NULL){
ListNode **ppHeadTmp = &pHeadSecond, **ppTailTmp = &pTailSecond;
if (p->val < x){
ppHeadTmp = &pHeadFirst;
ppTailTmp = &pTailFirst;
}
if (*ppHeadTmp == NULL){
*ppHeadTmp = p;
*ppTailTmp = p;
}
else{
(*ppTailTmp)->next = p;
*ppTailTmp = p;
}
p = p->next;
}
if (pTailFirst != NULL) pTailFirst->next = NULL;
if (pTailSecond != NULL) pTailSecond->next = NULL;
if (pTailFirst != NULL){
pTailFirst->next = pHeadSecond;
return pHeadFirst;
}
else{
return pHeadSecond;
}
}
};