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

将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并使奇数之间顺序反转,偶数之间顺序反转
如交换前: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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值