原题:
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
.
以后看到这种题需要注意:要加一个节点,指向head,我这里用的是pre和result,有比x小de节点都插在pre后面,最后返回的是result。
有这个情况需要注意,由于移动一个节点,需要其改变其前驱的next指针,因此我这里主要就是探测current->next,如果这个current->next的值小于x,就把这个节点插在pre的后面,然后current和pre移动,这里有一种特殊情况:
当pre和current不是一个时,由于current后面的节点被移走,相当于自动进行了current=current->next;当两个节点一致时,需要手动调节,如图:
代码如下(36ms):
class Solution {
public:
ListNode *partition(ListNode *head, int x) {
ListNode* pre = new ListNode(0);
pre->next = head;
ListNode * result = pre;
ListNode * current = pre;
while(current&¤t->next){
if(current->next->val < x ){
if(pre==current){
pre = pre->next;
current = current->next;
continue;
}
ListNode * move = current->next;
current->next = move->next;
move->next = pre->next;
pre->next = move;
pre = pre->next;
}
else current = current->next;
}
return result->next;
}
};