数据结构实验之链表五:单链表的拆分
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数。两个子链表中数据的相对次序与原链表一致。
Input
第一行输入整数N;;
第二行依次输入N个整数。
Output
第一行分别输出偶数链表与奇数链表的元素个数;
第二行依次输出偶数子链表的所有数据;
第三行依次输出奇数子链表的所有数据。
Sample Input
10 1 3 22 8 15 999 9 44 6 1001
Sample Output
4 6 22 8 44 6 1 3 15 999 9 1001
Hint
不得使用数组!
解题思路:和链表的归并相似,如果想要思路简单并且程序也简单的话,就建立两个链表头,并将偶数元素和奇数元素分别连接到两个链表后,尽量避免删除和插入的操作,否则程序部分会变的复杂并且容易出越界问题。
#include <bits/stdc++.h>
using namespace std;
struct node
{
int data;
struct node *next;
};
struct node * sequence_Linked_List(int);
struct node * split_Linked_List(struct node *);///拆分链表函数
void output_Linked_List(struct node *);
int count1, count2;
int main()
{
int n;
struct node *head1, *head2;
cin >> n;
head1 = sequence_Linked_List(n);
head2 = split_Linked_List(head1);///令奇数从链表中分离出来
///结果为链表1只剩下偶数,链表2只有奇数,并返回链表2的头结点
printf("%d %d\n", count1, count2);///分别输出偶数链表与奇数链表的元素个数
output_Linked_List(head1);///偶数链表
output_Linked_List(head2);///奇数链表
return 0;
}
struct node * sequence_Linked_List(int n)
{///顺序建立链表函数
struct node *head, *tail, *p;
head = (struct node *)malloc(sizeof(struct node));
head->next = NULL;
tail = head;
while(n--)
{
p = (struct node *)malloc(sizeof(struct node));
cin >> p->data;
tail->next = p;
tail = p;
}
tail->next = NULL;
return head;
};
struct node * split_Linked_List(struct node *head1)
{///拆分链表函数
///因为习惯用顺序建立链表的方法,所以需要比逆序建立多用两个 tail 指针
struct node *head2, *q, *p, *tail1, *tail2;
q = head1->next;///令 q 指向原链表的第一个元素
p = q->next;
head1->next = NULL;///置空 head1 用来建立偶数链表
head2 = (struct node *)malloc(sizeof(struct node));
head2->next = NULL;///建立 head2 用来建立奇数链表
tail1 = head1;///将两个 tail 指针指向两个头结点
tail2 = head2;
while(q)///当 q = NULL 时,退出循环,即拆分操作
{
if(q->data % 2 == 0)
{///当结点数据为偶数时,将此结点用顺序建立链表的方式连接到链表1尾端
tail1->next = q;
tail1 = q;
tail1->next = NULL;
count1++;///每当偶数链表元素增加,令 count1 加一
}
else
{///当结点数据为奇数时,将此结点用顺序建立链表的方式连接到链表2尾端
tail2->next = q;
tail2 = q;
tail2->next = NULL;
count2++;///每当奇数链表元素增加,令 count2 加一
}
q = p;///一次拆分结束后,令 q 指针后移
if(p) p = p->next;///当 p != NULL 时令 p 后移,防止越界访问造成出错!
}
return head2;
};
void output_Linked_List(struct node *head)
{
struct node *p;
p = head->next;
while(p)
{
if(p == head->next) printf("%d", p->data);
else printf(" %d", p->data);
p = p->next;
}
cout << endl;
}