1.算法思想
使用尾插法将结点插入当前工作结点中。
- 设置指针odd,even分别指向当前的奇数结点和偶数结点。
- 每次将新的奇数结点接到原奇数结点后面,偶数结点接到原偶数结点前面。
- 修改odd,even指针到新的位置。
- 重复上述步骤,直到odd指向空,说明该指针遍历完成,然后将奇数列和偶数列合并。
2.定义结构体
只使用到单链表的数据结构:
- data: 存放数据元素
- next: 用于指向下一个结点的指针
typedef struct LNode {
int data;
struct LNode *next;
} LNode, *LinkList;
3.转换函数
转换过程:

void AdjustList(LinkList A) {
//odd为奇数指针,even为偶数指针。heven为偶数的头指针
LNode* odd = A->next;
if(!A || !odd) {
printf("无数据!\n");
return;
}
LNode *even = A->next->next;
LNode *heven = (LNode *)malloc(sizeof(LNode));
heven->next = NULL;
while(odd && even) {
//尾插
odd->next = even->next;
//头插
even->next = heven->next;
heven->next = even;
//如果后面还有数据,则后移
if(odd->next) {
odd = odd->next;
even = odd->next;
} else break;//否则退出
}
//拼接奇数偶数序列
odd->next = heven->next;
}
4.测试结果
奇数个结果:

偶数个结果:

5.完整代码
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 20
typedef struct LNode {
int data;
struct LNode *next;
} LNode,*LinkList;
void AdjustList(LinkList A) {
//odd为奇数指针,even为偶数指针。heven为偶数的头指针
LNode* odd = A->next;
if(!A || !odd) {
printf("无数据!\n");
return;
}
LNode *even = A->next->next;
LNode *heven = (LNode *)malloc(sizeof(LNode));
heven->next = NULL;
while(odd && even) {
//尾插
odd->next = even->next;
//头插
even->next = heven->next;
heven->next = even;
//如果后面还有数据,则后移
if(odd->next) {
odd = odd->next;
even = odd->next;
} else break;//否则退出
}
//拼接奇数偶数序列
odd->next = heven->next;
}
int main() {
LinkList A = (LinkList)malloc(sizeof(LNode));
LNode *a1 = (LNode *)malloc(sizeof(LNode));
LNode *a2 = (LNode *)malloc(sizeof(LNode));
LNode *a3 = (LNode *)malloc(sizeof(LNode));
LNode *a4 = (LNode *)malloc(sizeof(LNode));
LNode *a5 = (LNode *)malloc(sizeof(LNode));
LNode *a6 = (LNode *)malloc(sizeof(LNode));
A->next = a1;
a1->next = a2;
a2->next = a3;
a3->next = a4;
a4->next = a5;
a5->next = a6;
a6->next = NULL;
a1->data = 1;
a2->data = 2;
a3->data = 3;
a4->data = 4;
a5->data = 5;
a6->data = 6;
LNode* p = A->next;
printf("原始数据为:\n");
while(p) {
printf("%d\t",p->data);
p = p->next;
}
AdjustList(A);
p = A->next;
printf("\n调整后的数据为:\n");
while(p) {
printf("%d\t", p->data);
p = p->next;
}
return 0;
}
文章介绍了使用尾插法和头插法重组链表,将奇数节点和偶数节点分开的算法思想。定义了LNode结构体表示单链表节点,并提供了AdjustList函数来执行转换。测试结果显示了不同数量节点的链表在经过调整后的状态。完整代码展示了如何创建和操作链表以实现这一功能。
309

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



