设计一个算法,将一个结点值自然数的单链表拆分为两个单链表,原表中保留值为偶数的结点,而值为奇数的结点按它们在原表中的相对次序组成一个新的单链表。(C语言)
时间: 2024-10-13 22:17:42 浏览: 54
为了将一个值为自然数的单链表按照奇偶性拆分成两部分,我们可以创建两个新的链表:一个是用于存放偶数节点,另一个是存放奇数节点。下面是一个基本的C语言算法实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 创建新链表节点
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 助手函数:检查链表是否为空
int isEmpty(ListNode* head) {
return head == NULL;
}
// 主函数:拆分链表
void splitEvenOdd(ListNode** evenHead, ListNode** oddHead, ListNode* inputHead) {
ListNode* evenTail = NULL;
ListNode* oddTail = NULL;
ListNode* current = inputHead;
while (current != NULL) {
// 检查当前节点的值
if (current->val % 2 == 0) { // 偶数节点
if (isEmpty(*evenHead)) {
*evenHead = current;
evenTail = current;
} else {
evenTail->next = current;
evenTail = current;
}
} else { // 奇数节点
if (isEmpty(*oddHead)) {
*oddHead = current;
oddTail = current;
} else {
oddTail->next = current;
oddTail = current;
}
}
current = current->next;
}
}
// 打印链表
void printList(ListNode* head) {
while (head != NULL) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 初始化示例链表
ListNode* inputHead = createNode(1);
inputHead->next = createNode(2);
inputHead->next->next = createNode(3);
inputHead->next->next->next = createNode(4);
inputHead->next->next->next->next = createNode(5);
ListNode* evenHead = NULL;
ListNode* oddHead = NULL;
splitEvenOdd(&evenHead, &oddHead, inputHead);
printf("Even List: ");
printList(evenHead);
printf("\nOdd List: ");
printList(oddHead);
return 0;
}
```
这个程序首先创建了两个链表`evenHead`和`oddHead`作为结果,然后遍历输入链表`inputHead`,根据节点值的奇偶性添加到对应的链表。最后,我们分别打印出两个拆分后的链表。
阅读全文