将单链表l1拆成二个链表,其中以l1为头的链表保持原来向后的链接,个链表的头为l2,其链接方向与l1相反,l1包含原链表的奇数序号的结点,l2包含原链表的偶数序列的结点,通过main函数完成函数调报。
时间: 2023-04-13 09:04:12 浏览: 128
【PTA数据结构】7-2 两个有序链表序列的合并.txt
可以按照以下步骤将单链表l1拆成两个链表l1和l2:
1. 定义两个指针p1和p2,分别指向l1和l2的头结点。
2. 遍历l1,将奇数序号的结点插入到l1中,将偶数序号的结点插入到l2中。
3. 插入结点时,需要注意修改指针的指向,使得l1和l2的链接方向相反。
4. 最后返回l2的头结点即可。
以下是示例代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkedList;
LinkedList createLinkedList(int arr[], int n) {
LinkedList head = (LinkedList) malloc(sizeof(Node));
head->next = NULL;
Node *p = head;
for (int i = 0; i < n; i++) {
Node *node = (Node *) malloc(sizeof(Node));
node->data = arr[i];
node->next = NULL;
p->next = node;
p = node;
}
return head;
}
void printLinkedList(LinkedList head) {
Node *p = head->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
LinkedList splitLinkedList(LinkedList l1, LinkedList *l2) {
Node *p1 = l1, *p2 = *l2 = (LinkedList) malloc(sizeof(Node));
p2->next = NULL;
Node *q1 = p1, *q2 = p2;
int count = 1;
while (p1->next) {
p1 = p1->next;
count++;
if (count % 2 == 0) {
q2->next = p1;
q2 = p1;
} else {
q1->next = p1;
q1 = p1;
}
}
q1->next = NULL;
q2->next = NULL;
return *l2;
}
int main() {
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
LinkedList l1 = createLinkedList(arr, 9);
printf("l1: ");
printLinkedList(l1);
LinkedList l2;
LinkedList l3 = splitLinkedList(l1, &l2);
printf("l2: ");
printLinkedList(l2);
printf("l3: ");
printLinkedList(l3);
return 0;
}
```
阅读全文