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.
Example:
Input: head = 1->4->3->2->5->2, x = 3
Output: 1->2->2->4->3->5
方法1:
prev指向 第一个大于等于x的前一个节点(1), current向前搜索并指向下一个小于x的前一个节点(3),tmp指向下一个小于x的节点(2)。swap之后向前推进prev。
易错点:
- 这里的current是指向前一个,而tmp是想要交换的节点
- 前进时的判断条件,pre遇到<x时前进,current遇到>=时前进
// 1 -> 4 -> 3 -> 2 -> 5 -> 2
//prev current tmp
// 1 -> 2 -> 4 -> 3 -> 5 -> 2
//prev tmp current
// 1 -> 2 -> 4 -> 3 -> 5 -> 2
// prev current
// 1 -> 2 -> 4 -> 3 -> 5 -> 2
// prev current tmp
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if (!head) return head;
ListNode* newHead = new ListNode(-1);
newHead -> next = head;
ListNode* prev = head;
while (prev -> next && prev -> next -> val < x) {
prev = prev -> next;
}
ListNode* current = prev;
while (current -> next) {
if (current -> next -> val >= x){
current = current -> next;
}
else {
ListNode* tmp = current -> next;
current -> next = tmp -> next;
tmp -> next = prev -> next;
prev -> next = tmp;
prev = prev -> next;
// current = current -> next;
}
}
}
};
方法2:
grandyang: http://www.cnblogs.com/grandyang/p/4321292.html
此题还有一种解法,就是将所有小于给定值的节点取出组成一个新的链表,此时原链表中剩余的节点的值都大于或等于给定值,只要将原链表直接接在新链表后即可
class Solution {
public:
ListNode *partition(ListNode *head, int x) {
if (!head) return head;
ListNode *dummy = new ListNode(-1);
ListNode *newDummy = new ListNode(-1);
dummy->next = head;
ListNode *cur = dummy, *p = newDummy;
while (cur->next) {
if (cur->next->val < x) {
p->next = cur->next;
p = p->next;
cur->next = cur->next->next;
p->next = NULL;
} else {
cur = cur->next;
}
}
p->next = dummy->next;
return newDummy->next;
}
};