合并和拆分线性表 .把链表扩大成2倍大小,把链表变成前后对称的链表。 .把链表中的整数按照奇偶性拆成两个链表(原来的链表可以存放拆开后的一个链表)。用C语言解决本题
时间: 2024-10-20 07:01:56 浏览: 31
合并和拆分线性表是链表操作中的常见任务,下面分别给出针对这两种情况的C语言解决方案:
**1. 扩大链表两倍并使其前后对称:**
```c
// 假设链表结构为:
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
void double_and_symmetricize(ListNode** head) {
if (*head == NULL || (*head)->next == NULL) {
return; // 如果链表为空或者只有一个节点,不需要处理
}
ListNode* slow = *head;
ListNode* fast = *head->next;
ListNode* prev = NULL;
while (fast != NULL && fast->next != NULL) {
slow->next = fast->next;
slow = slow->next;
fast = fast->next->next;
prev = slow;
}
slow->next = prev; // 将慢指针指向原头节点,形成前后对称
// 创建新链表,长度为原来两倍
ListNode* new_head = (ListNode*)malloc(sizeof(ListNode));
new_head->val = (*head)->val;
new_head->next = *head;
*head = new_head;
// 插入对称部分到新链表
while (prev != NULL) {
prev->next = prev->next->next;
prev = prev->next;
}
}
```
**2. 按照奇偶性拆分链表:**
```c
void split_list(ListNode** head) {
if (*head == NULL) {
return;
}
ListNode* odd = *head;
ListNode* even = NULL;
ListNode* current = *head->next;
while (current != NULL) {
ListNode* temp = current->next;
current->next = even;
if (temp != NULL) {
even->next = temp;
} else {
even = NULL; // 结束偶数链表
}
if (temp != NULL) { // 奇数链表继续推进
odd->next = temp;
odd = temp;
} else {
odd = NULL; // 结束奇数链表
}
current = temp;
}
*head = odd; // 更新原始链表头指针,奇数链表位于前面
}
```
阅读全文