您的位置:首页 > 其它

LeetCode Partition List

2014-02-22 21:40 369 查看
关于链表的移动其实没什么,突然想到了能不能一段一段地移动呢,这样对于本身连在一起的就不用拆了在链接上了,应该是可以的,但一定是以一个为基准。下面的程序只是第一步移动了一段其他情况还是一个一个的移动,不能算高效。

// LeetCode_PartitionList.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
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||head->next==NULL)
return head;
ListNode *lesshead=NULL,*greaterhead=NULL,*p=NULL,*q=NULL,*s=NULL,*t=NULL,*lesstail=NULL,*greatertail=NULL;
p = head;
if(p->val>=x)
{
greaterhead = p;
while(p&&p->val>=x)
p = p->next;
if(p)
lesshead = p;
else
return head;// no value less than x
}
else
{
lesshead = p;
while(p&&p->val<x)
p = p->next;
if(p)
greaterhead = p;
else
return head;// no value greater than x
}
if(head->val<x)
{
p=head;
while(p->next&&p->next->val<x)
p = p->next;
if(p->next==NULL)
return head;
lesstail = p;
greaterhead = p->next;
q=greaterhead;
while(q->next&&q->next->val>=x)
q = q->next;
greatertail = q;
lesstail->next = greatertail->next;
q=lesstail;
}
else
{
p=head;
while(p->next&&p->next->val>=x)
p = p->next;
if(p->next==NULL)
return head;
greatertail = p;
lesshead = p->next;
q=lesshead;
}
while(q->next)
{
if(q->next->val<x)
q=q->next;
else
{
s = q->next;
q->next = s->next;
greatertail->next = s;
greatertail = greatertail->next;
}
}
greatertail->next = NULL;
q->next = greaterhead;
return lesshead;
}

int _tmain(int argc, _TCHAR* argv[])
{
ListNode *a = new ListNode(6);
ListNode *b = new ListNode(5);
ListNode *c = new ListNode(3);
ListNode *d = new ListNode(1);
ListNode *e = new ListNode(5);
ListNode *f = new ListNode(4);
a->next = b;
b->next = c;
c->next = d;
d->next = e;
e->next = f;
ListNode *rethead=NULL;
rethead = partition(a,3);
ListNode *p = rethead;
while(p!=NULL)
{
cout<<p->val<<" ";
p = p->next;
}
system("pause");
return 0;
}


下面的方法每次移动一段链表,不是一个个的移动,对于符合成段的用例时间应该会减少,但编译器的提交结果显示不是特别明显,反而时间还增加了。方法是对的。AC了。

ListNode *partition02(ListNode *head, int x) {
if(head==NULL||head->next==NULL)
return head;
ListNode *lesshead=NULL,*greaterhead=NULL,*p=NULL,*q=NULL,*s=NULL,*t=NULL,*lesstail=NULL,*greatertail=NULL;
s = head;
if(s->val>=x)
p = s;
else
{
while(s->next&&s->next->val<x)
s=s->next;
p = s->next;
}
if(p==NULL)
return head;
q = p;
while(q->next&&q->next->val>=x)
q = q->next;
t = q->next;
if(t==NULL)
return head;
if (s->next==p)
{
s->next = t;
lesshead = head;
}
else
{
lesshead = t;
}
greaterhead = p;
greatertail = q;
s = t;
while(s->next)
{
while(s->next&&s->next->val<x)
s=s->next;
p = s->next;
if(p==NULL)
{
s->next = greaterhead;
greatertail->next =p;
return lesshead;
}
q = p;
while(q->next&&q->next->val>=x)
q = q->next;
t = q->next;
if (t==NULL)
{
s->next = greaterhead;
greatertail->next = p;
return lesshead;
}
s->next = t;
greatertail->next = p;
greatertail = q;
s = t;
}
if (s->next==NULL)
{
s->next = greaterhead;
greatertail->next = NULL;
}
return lesshead;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: