Partition List
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指针、cur指针、mov指针,pre指针指向当前待处理元素的前一元素,cur指针指向当前待处理元素,mov指针指向当前最后一个小于x的元素。
代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* partition(ListNode* head, int x)
{
ListNode *mov, *pre, *cur;
ListNode *rhead = (ListNode*) malloc(sizeof(ListNode));
rhead->val = -1;
rhead->next = head;
mov = rhead;
pre = rhead;
cur = head;
while(cur)
{
if(cur->val < x)
{
if(mov->next == cur)
{
mov = mov->next;
pre = cur;
cur = cur->next;
}
else
{
pre->next = cur->next;
cur->next = mov->next;
mov->next = cur;
mov = cur;
cur = pre->next;
}
}
else
{
pre = cur;
cur = cur->next;
}
}
return rhead->next;
}
int main()
{
int x, n;
ListNode* head = NULL, *tmp;
cin>>x;
while(cin >> n)
{
tmp = (ListNode*) malloc(sizeof(ListNode));
tmp->val = n;
tmp->next = head;
head = tmp;
}
head = partition(head, x);
tmp = head;
while(tmp)
{
cout<<tmp->val<<endl;
tmp = tmp->next;
}
}