给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。如下实例。

本文介绍了一种链表操作算法,将链表中的奇数位置节点与偶数位置节点进行分离并重新组合。通过遍历链表,将奇数位置的节点连接在一起,偶数位置的节点连接在一起,最后将两部分链表合并。

26.给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。如下实例。
示例 :
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL

#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode;

/*struct LNode *CreateLNode(){
    struct LNode *head;
    struct LNode *p1,*p2;

     p1=p2=(LNode*)malloc(sizeof(struct LNode));
    printf("请输入节点数据:(9999结束)\n");

    scanf("%d",&p1->data);
    head=NULL;
    head=p1;
    while(p1->data!=9999){
        p1=(LNode*)malloc(sizeof(struct LNode));
        p2->next=p1;
        p2=p1;
        printf("请输入节点数据:(9999结束)\n");
        scanf("%d",&p1->data);
    }


    return head;
};
*/

struct LNode *CreateLNode(){              //返回head 头指针
 	struct LNode *head;
 	struct LNode *p1,*p2;
	 int n=0;
	 p1=p2=(struct LNode*) malloc(sizeof(struct LNode));   //让p1, p2都指向新建的结点空间
	 scanf("%d",&p1->data);  //输入第一个结点的数据
	 head=NULL;                             //先令结点指向空
	 while(p1->data!=0){                     //作为结束输入数据的判断,输入数据0 ————结束
	 	n=n+1;
	 	if(n==1)                            //让head头指针指向第一个结点
		 head=p1;
	 	else p2->next=p1;
	 	p2=p1;                            //让p2指向第一个结点,p1再去开辟空间
	 	p1=(struct LNode*)malloc(sizeof(struct LNode));   // 让p2指向第一个结点,p1再去开辟空间
	 	scanf("%d",&p1->data);  //开辟后输入数据
	 }
 	p2->next=NULL;
 	return(head);
 }

struct LNode *func(struct LNode *L){
    struct LNode * odd,* even,*head=L,*even_head;
    odd=head;  //奇数结点指向第一个
    even=head->next; // 偶数结点指向第二个
    even_head=head->next;   //保存偶数节点的头指针,后续链接
    while(odd!=NULL&&odd->next!=NULL){   //判断
    odd->next=odd->next->next;         //奇数结点连接下一个的下一个
    odd=odd->next;                     //奇数结点指针指向当前的
    even->next=even->next->next;       //偶数结点连接下一个的下一个
    even=even->next;                  //偶数结点指针指向当前的
}
    odd->next=even_head;            //连接
return head;                        //返回头指针

};
struct LNode print(struct LNode *p){
    printf("排序后输出:\n");
while(p->next!=NULL){

    printf("%3d",p->data);
    p=p->next;
}
}
int main()
{
    struct LNode *p1,*p2;
    p1=CreateLNode();
    p2=func(p1);
    print(p2);
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值