数据结构实验之链表五:单链表的拆分
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数。两个子链表中数据的相对次序与原链表一致。
Input
第一行输入整数N;;
第二行依次输入N个整数。
第二行依次输入N个整数。
Output
第一行分别输出偶数链表与奇数链表的元素个数;
第二行依次输出偶数子链表的所有数据;
第三行依次输出奇数子链表的所有数据。
第二行依次输出偶数子链表的所有数据;
第三行依次输出奇数子链表的所有数据。
Example Input
10 1 3 22 8 15 999 9 44 6 1001
Example Output
4 6 22 8 44 6 1 3 15 999 9 1001
在遍历的过程中将奇数放入新表,偶数留在原表即可。
#include<stdio.h> #include<stdlib.h> typedef struct node{ int data; struct node *next; }*linkList; int count = 0; void creatList(linkList &L,int n){ struct node *p, *tail; L =new node; tail = L; for(int i = 0; i < n; i++){ p = (struct node*)malloc(sizeof(struct node)); scanf("%d", &p->data); p->next = NULL; tail->next = p; tail = p; } }; void outputData(linkList &L){ struct node *p; p = L->next; while(p){ if(p->next == NULL) printf("%d\n", p->data); else printf("%d ", p->data); p = p->next; } } linkList chaifen(linkList head){ linkList p, q; linkList head2, tail, tail2; head2 = new node; head2->next = NULL; tail2 = head2; p = head->next; head->next = NULL; tail = head; q = p->next; while(p) { if(p->data % 2 != 0) { p->next = tail->next; tail->next = p; tail = p; count ++; } else { p->next = tail2->next; tail2->next = p; tail2 = p; } p = q; if(q) q = q->next; } return head2; } int main(){ int n; scanf("%d", &n); linkList La, L; creatList(La, n); L = chaifen(La); printf("%d %d\n", n-count, count); outputData(L); outputData(La); return 0; }