题干:
裁判程序:
样例:
先说思路吧,我想的是把原链表分为奇数链表和偶数链表,但不去开辟空间(malloc),这样就可以达到节省时间和空间的目的。
参考代码:
struct ListNode *readlist()//这里是一个尾插法创建链表
struct ListNode *head = NULL, *tail = NULL;
do{
struct ListNode *p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = NULL;
scanf("%d", &p->data);
if((p->data)!=-1)
{
if(head)
{
tail->next = p;
tail = p;
}else{
head = tail = p;
}
}else
break;
} while (1);
return head;
}
struct ListNode *getodd( struct ListNode **L )
{
struct ListNode *oddhead = NULL, *oddtail = NULL;
//oddhead和oddtail分别代表奇数链表的头结点和尾结点
struct ListNode *temp = *L, *tail=NULL;
//temp用于原链表遍历,tail代表偶数链表的尾结点
*L=NULL;//此函数结束后,L将代表偶数链表的头结点
//由于L的数据已经被temp继承,所以这里的修改并没有什么问题
int judge = 1;//judge用于判断temp遍历的结点的数据是否是链表之中的第一个偶数
//1为是,找到第一个偶数后改为0且不再变动以防止误判
while(temp)
{
if((temp->data)%2)//判断数据奇偶性
{ //数据对2取余后,值只能为1或0,值为1时进if分支,值为0时进else分支
if(oddhead)
{
oddtail->next = temp;
oddtail = temp;
}else{
oddhead = oddtail = temp;
}
}else{
if(judge)
{
(*L) = tail = temp;
judge = 0;
}else{
tail->next = temp;
tail = temp;
}
}
//以上,用尾插法分别创建了两个链表,if分支为奇数,else为偶数
temp = temp->next;//temp后移进行遍历
}
if(oddtail)//若尾结点不为空则给奇数链表封尾
oddtail->next = NULL;
if(tail)//若尾结点不为空则给偶数链表封尾
tail->next = NULL;
return oddhead;
}