leetcode:单链表之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.
即:给定一个单链表和一个x,把链表中小于x的放到前面,大于等于x的放到后面,每部分元素的原始相对位置不变。
c++实现:
#include <iostream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode (int x):val(x),next(NULL){ }
};
ListNode *createListNode(int arr[],int n)
{
ListNode *r;
ListNode *p;
ListNode * L=(ListNode*)malloc(sizeof(ListNode));
r=L;
for(int i=0;i<n;i++)
{
p=(ListNode*)malloc(sizeof(ListNode));
p->val=arr[i];
r->next=p;
r=p;
}
r->next=NULL;
return L->next;
}
ListNode *partition(ListNode* head, int x)
{
if (head == NULL)
return head;
ListNode left_dummy(0); // 头结点
ListNode right_dummy(0); // 头结点
auto left_cur = &left_dummy;
auto right_cur = &right_dummy;
for (; head; head = head->next)
{
if (head->val < x)
{
left_cur->next = head;
left_cur = head;
}
else
{
right_cur->next = head;
right_cur = head;
}
}
left_cur->next = right_dummy.next;
right_cur->next = NULL;
return left_dummy.next;
}
int main()
{
int a[]={1,4,3,2,5,2};
ListNode *input;
ListNode *out;
int x=3;
input= createListNode(a,6);
out=partition(input, x);
while(out != NULL)
{
cout<<out->val;
out = out->next;
}
cout<<endl;
return 0;
}