您的位置:首页 > 其它

Partition List

2015-08-15 22:11 239 查看
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的值,另一个链表存储大于零的值。

#include <iostream>

#include<stdio.h>

#include<stack>

#include <vector>

#include <iterator>

#include <string>

using std::stack;

using std::vector;

using namespace std;

struct ListNode {

int val;

ListNode *next;

ListNode(int x) : val(x), next(NULL) {}

};

ListNode* partition(ListNode* head, int x)

{

if(head==NULL)

return head;

// ListNode* phead=head;

ListNode* lessthan_number=(ListNode*)malloc(sizeof(ListNode));

ListNode* greatthan_number=(ListNode*)malloc(sizeof(ListNode));

greatthan_number->next=NULL;

lessthan_number->next=NULL;

ListNode* p=lessthan_number;

ListNode* q=greatthan_number;

ListNode* a;

ListNode* b;

while(head!=NULL)

{

if(head->val<x)

{

a=(ListNode*)malloc(sizeof(ListNode));

a->val=head->val;

a->next=NULL;

p->next=a;

p=a;

head=head->next;

}

else

{

b=(ListNode*)malloc(sizeof(ListNode));

b->val=head->val;

b->next=NULL;

q->next=b;

q=b;

head=head->next;

}

}

if(greatthan_number->next!=NULL)

p->next=greatthan_number->next;

return lessthan_number->next;

// free(lessthan_number);

// free(greatthan_number);

}

ListNode* creat()

{

ListNode *head,*p,*s;

int x,cycle=1;

head=(ListNode*)malloc(sizeof(ListNode));

p=head;

while(cycle)

{

//printf("\n please input you data\n");

scanf("%d",&x);

if(x!=0)

{

s=(ListNode*)malloc(sizeof(ListNode));

s->val=x;

s->next=NULL; //这句是使尾节点的next值不指向一个位置的位置,而指向NULL

printf("\n %d",s->val);

p->next=s;

p=s;

}

else cycle=0;

}

head=head->next;

//printf("\n %d",head->val);

return head;

}

int main()

{

ListNode* head;

head=creat();

ListNode* newhead;

int x=3;

newhead=partition(head,x);

while(newhead!=NULL)

{

printf("\n %d",newhead->val);

newhead=newhead->next;

}

return 0;

}

方法二:利用两个链表指针分别来指向。

ListNode* partition(ListNode* head, int x)

{

if(head==NULL)

return head;

ListNode* lessthan_number=(ListNode*)malloc(sizeof(ListNode));

ListNode* greatthan_number=(ListNode*)malloc(sizeof(ListNode));

ListNode* p=lessthan_number;

ListNode* q=greatthan_number;

while(head!=NULL)

{

if(head->val<x)

{

p->next=head;

p=p->next;

head=head->next;

}

else

{

q->next=head;

q=q->next;

head=head->next;

}

}

q->next=NULL;

p->next=greatthan_number->next;

return lessthan_number->next;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: