链表奇偶排序以及反转问题

来源:互联网 发布:卓越之剑全套完整源码 编辑:程序博客网 时间:2024/05/22 00:44

将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并使奇数之间顺序反转,偶数之间顺序反转
如交换前: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;}
0 0
原创粉丝点击