设计一个算法,将一个头节点为A 的单链表(其数据域为整数) 分解为两个单链表A和B,使得A 链表只含有原来链表中 data 域为奇数的节点,而B链表中只含有原来 data 域为偶数的节点,且保持原来的顺序。C语言
时间: 2024-10-08 07:15:20 浏览: 31
设计这样一个算法,可以分为以下几个步骤:
1. 定义结构体 `ListNode` 作为单链表节点,包含 `data` 和 `next` 指针:
```c
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
```
2. 创建两个辅助指针 `oddHead` 和 `evenHead`,分别指向新的奇数链表和偶数链表的头节点,初始值设为 `NULL`。
3. 使用一个遍历循环,对于给定链表 A 中的每个节点:
a. 检查当前节点的数据 `data` 是否为奇数:
```c
if (A->data % 2 == 0) {
// 数据是偶数,添加到偶数链表 B
if (evenHead != NULL) {
evenHead->next = A;
evenHead = A;
} else {
evenHead = A;
}
} else {
// 数据是奇数,添加到奇数链表 A
if (oddHead != NULL) {
oddHead->next = A;
oddHead = A;
} else {
oddHead = A;
}
}
```
4. 在处理完所有节点后,检查原链表最后一个插入的是奇数还是偶数,因为可能会有一个单独的偶数节点未加入到 B 链表。所以需要额外处理一次:
```c
if (A->next != NULL && A->next->data % 2 == 0) {
evenHead->next = A->next;
}
```
5. 最终返回奇数链表 `oddHead` 和偶数链表 `evenHead` 的头节点。
完整的 C 语言代码实现如下:
```c
ListNode* oddEvenList(ListNode* A) {
ListNode* oddHead = NULL;
ListNode* evenHead = NULL;
while (A != NULL) {
if (A->data % 2 == 0) {
if (evenHead != NULL) {
evenHead->next = A;
evenHead = A;
} else {
evenHead = A;
}
} else {
if (oddHead != NULL) {
oddHead->next = A;
oddHead = A;
} else {
oddHead = A;
}
}
A = A->next;
}
if (A->next != NULL && A->next->data % 2 == 0) {
evenHead->next = A->next;
}
return oddHead;
}
```
阅读全文