[LeetCode] 066: Partition List

[Problem]

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.


[Solution]

/**
* 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) {
// Note: The Solution object is instantiated only once and is reused by each test case.
// invalid
if(NULL == head)return NULL;

// the first one that bigger than or equals to x
ListNode* pre1 = head; // the one before p1
ListNode* p1 = head; // the one bigger than or equals to x
while(p1 != NULL && p1->val < x){
pre1 = p1;
p1 = p1->next;
}

// all the elements in the list is small than x
if(p1 == NULL){
return head;
}

// the first one after p1 that smaller than x
ListNode* pre2 = p1; // the one before p2
ListNode* p2 = pre2->next; // the one smaller than x after p1

// swap the elements after p1 and smaller than x to the front of p1
while(p2 != NULL){
while(p2 != NULL && p2->val >= x){
pre2 = p2;
p2 = p2->next;
}

// end of the list
if(p2 == NULL)break;

// swap
// p1 is the head of the list
if(pre1 == p1){
pre2->next = p2->next;
p2->next = p1;
head = p2;
pre1 = p2;
p2 = pre2->next;
}
else{
pre2->next = p2->next;
p2->next = p1;
pre1->next = p2;
pre1 = p2;
p2 = pre2->next;
}
}
return head;
}
};

说明:版权所有,转载请注明出处。 Coder007的博客
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值