注:可以使用头插法,但是头插法会使新链表逆序,以下是对头插法做的小小的升级,新链表不需要进行逆置。
代码实现:
#include<bits/stdc++.h>
using namespace std;
int O,J;
struct node
{
int data;
struct node *next;
};
struct node *creat(int n)///顺序建立链表。
{
struct node *head,*p,*tail;
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
tail=head;
int t;
while(n--)
{
p=(struct node *)malloc(sizeof(struct node));
scanf("%d",&t);
p->data=t;
p->next=NULL;
tail->next=p;
tail=p;
}
return head;
}
struct node *fen(struct node *head1)///拆分
{
struct node *head2,*p,*q,*z,*w;
head2=(struct node *)malloc(sizeof(struct node));
head2->next=NULL;
p=head1->next;
q=p->next;
head1->next=NULL;
z=head1;
w=head2;
while(p)
{
if(p->data%2!=0)
{
J++;
p->next=w->next;
w->next=p;
w=p;
}
else
{
O++;
p->next=z->next;
z->next=p;
z=p;
}
p=q;
if(q)
q=q->next;
}
return head2;
}
void display(struct node *head) ///遍历链表。
{
struct node *q;
q=head->next;
while(q)
{
if(q->next!=NULL)
{
printf("%d ",q->data);
}
else
{
printf("%d\n",q->data);
}
q=q->next;
}
}
int main()
{
struct node *head1,*head2;
int n;
scanf("%d",&n);
head1=creat(n);
head2=fen(head1);
printf("%d %d\n",O,J);
display(head1);
display(head2);
return 0;
}