将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并使奇数之间顺序反转,偶数之间顺序反转
如交换前:4->5->1->7->6
交换后:7->1->5->6->4
思路:申请两个头结点podd,peven分别指向奇数和偶数,开始遍历链表,若为奇数,结点podd指向该结点;若为偶数,则结点peven指向该点。最后分别进行顺序反转。如只要输出反转结果,不改变指针结构,可以运用递归或者堆栈的方式输出。
代码如下:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct LNode
{
int value;
struct LNode *next;
};
LNode* createNode(int value)
{
LNode* p=new LNode();
//LNode *p=(LNode*)malloc(sizeof(LNode));
p->value=value;
p->next=NULL;
return p;
}
void ConnectNode(LNode *Pcurrent,LNode *Pnext)
{
if(Pcurrent==NULL)
{
printf("err to connection ");
exit(1);
}
Pcurrent->next=Pnext;
}
struct LNode* Reverse(LNode *p)
{
if(p==NULL )
return NULL ;
if( p->next==NULL)
return p;
LNode* phead=p;
LNode* temp=p->next;
while(temp)
{
LNode* pNext=temp->next;
temp->next=p;
p=temp;
temp=pNext;
}
phead->next=NULL;
return p;
}
void PrintNode(LNode* p)
{
if(p==NULL)
return ;
while(p)
{
printf("%d ",p->value);
p=p->next;
}
}
LNode* SwapNode(LNode* p)
{
LNode *Peven=new LNode(); //偶数链表
LNode *Podd=new LNode(); //奇数链表
LNode *PheadOdd=Podd;
LNode *PheadEven=Peven;
while(p!=NULL)
{
if(p->value%2==0)
{
Peven->next=p;
Peven=p;
}
else
{
Podd->next=p;
Podd=p;
}
p=p->next;
}
Peven->next=NULL;
Podd->next=NULL;
Podd=Reverse(PheadOdd->next);//5 7 1
//PrintNode(Podd);
Peven=Reverse(PheadEven->next);
//PrintNode(Peven);
p=Podd;
while(Podd->next)
{
Podd=Podd->next;
}
Podd->next=Peven;
return p;
}
int main()
{
LNode *pNode=createNode(4);
LNode *p1=createNode(5);
LNode *p2=createNode(1);
LNode *p3=createNode(7);
LNode *p4=createNode(6);
ConnectNode(pNode,p1);
ConnectNode(p1,p2);
ConnectNode(p2,p3);
ConnectNode(p3,p4); //连接结点 4->5->7->1->6
// PrintNode(p);
LNode *phead=SwapNode(pNode);
PrintNode(phead);
return 0;
}