#include
#include
using namespace std;
struct node {
struct node *next;
int value;
};
node *CreateListNode(int value)
{
if(value==NULL)
return NULL;
node *pNode=(node*)malloc(sizeof(node));
pNode->value=value;
pNode->next=NULL;
return pNode;
}
void ConnectNodes(node*pCurrent,node* pNext)
{
if (pCurrent==NULL)
{
cout<<"Error to connect two nodes."<<endl;
exit(1);
}
pCurrent->next=pNext;
}
void PrintList(node* pHead)
{
node *pNode=pHead;
while (pNode!=NULL)
{
cout<value<<" ";
pNode=pNode->next;
}
cout<<endl;
}
struct node *reverse(struct node *list)
{
if (list==NULL)
return NULL;
if(list->next==NULL)
return list;
node* tPre=list;
node* tmp=list->next;
while (tmp)
{
node* tNext=tmp->next;
tmp->next=tPre;
tPre=tmp;
tmp=tNext;
}
list->next=NULL;
list=tPre;
return list;
}
struct node *swap(struct node *list)
{
if (list==NULL)
return NULL;
if (list->next==NULL)
return list;
node *p=list;
node *OddHead=(node*)malloc(sizeof(node));
node *EvenHead=(node*)malloc(sizeof(node));
node *Odd=OddHead;
node *Even=EvenHead;
while (p)
{
if (p->value%2==0)
{
Even->next=p;
Even=p;
}
else
{
Odd->next=p;
Odd=p;
}
p=p->next;
}
Even->next=NULL;
Odd->next=NULL;
Even=reverse(EvenHead->next);
Odd=reverse(OddHead->next);
OddHead=Odd;
while (Odd->next)
Odd=Odd->next;
Odd->next=Even;
return OddHead;
//return OddHead;
}
int main()
{
node *pNode1=CreateListNode(4);
node *pNode2=CreateListNode(5);
node *pNode3=CreateListNode(7);
node *pNode4=CreateListNode(1);
node *pNode5=CreateListNode(6);
ConnectNodes(pNode1,pNode2);
ConnectNodes(pNode2,pNode3);
ConnectNodes(pNode3,pNode4);
ConnectNodes(pNode4,pNode5);
node* p=swap(pNode1);
PrintList(p);
return 0;
}