将一个带头结点的单链表A分解为两个带头结点的的单链表A和B,使得A表中含有表中序号为奇数的元素,而B中含有原表中序号为偶数的元素,且保持其相对顺序不变 用c语言写出代码
时间: 2024-12-11 11:20:12 浏览: 15
C语言实现单链表(带头结点)的基本操作
为了实现这个功能,我们可以创建两个新的链表头节点`headA`和`headB`,以及两个指针`p`(指向当前处理的元素)、`prev`(保存前一个元素)。遍历给定的链表,根据元素的索引(这里我们假设链表已经按升序排列,如果未排序则需要先排序)来决定将它添加到哪个链表。
以下是C语言的一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 结构体表示链表节点
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 函数用于拆分链表
ListNode* splitList(ListNode* head) {
ListNode* headA = (ListNode*)malloc(sizeof(ListNode));
ListNode* headB = (ListNode*)malloc(sizeof(ListNode));
ListNode* p = head;
ListNode* prev = NULL;
int isOdd = 0; // 判断当前元素是否为奇数
while (p != NULL) {
if (isOdd) { // 如果当前索引为奇数,添加到A链表
p->next = headA->next;
headA->next = p;
isOdd = 0; // 设置下一次变为偶数位置
} else { // 否则添加到B链表
p->next = headB->next;
headB->next = p;
isOdd = 1; // 设置下一次变为奇数位置
}
prev = p;
p = p->next;
}
// 如果A链表为空,直接返回B链表
if (headA->next == NULL) return headB;
// 否则,连接B链表的最后一个元素到A链表的末尾
prev->next = headA->next;
return headB;
}
// 打印链表
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->val);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
// 创建测试链表示例
ListNode* testHead = malloc(sizeof(ListNode));
testHead->val = 1;
testHead->next = malloc(sizeof(ListNode));
testHead->next->val = 2;
testHead->next->next = malloc(sizeof(ListNode));
testHead->next->next->val = 3;
testHead->next->next->next = malloc(sizeof(ListNode));
testHead->next->next->next->val = 4;
testHead->next->next->next->next = NULL;
ListNode* result = splitList(testHead);
printf("Original list (A): ");
printList(result);
return 0;
}
```
在这个例子中,原始链表`testHead`会被分解成两个新链表,第一个链表包含奇数位置的元素(1, 3),第二个链表包含偶数位置的元素(2, 4)。运行上面的`main`函数即可看到结果。
阅读全文