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;
}

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

被折叠的 条评论
为什么被折叠?



