本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中奇数值的结点重新组成一个新的链表。链表结点定义如下:
struct ListNode {
int data;
ListNode *next;
};
函数接口定义:
struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
函数readlist
从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。
函数getodd
将单链表L
中奇数值的结点分离出来,重新组成一个新的链表。返回指向新链表头结点的指针,同时将L
中存储的地址改为删除了奇数值结点后的链表的头结点地址(所以要传入L
的指针)。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
struct ListNode *p = L;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *L, *Odd;
L = readlist();
Odd = getodd(&L);
printlist(Odd);
printlist(L);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1 2 2 3 4 5 6 7 -1
输出样例:
1 3 5 7
2 2 4 6
正确答案:
struct ListNode* readlist()
{
struct ListNode* head = NULL;
struct ListNode* p = NULL;
int flag;
scanf("%d", &flag);
if (flag != -1)
{
head = malloc(sizeof(struct ListNode));
p = head;
head->data = flag;
scanf("%d", &flag);
while (flag != -1)
{
p->next = malloc(sizeof(struct ListNode));
p = p->next;
p->data = flag;
scanf("%d", &flag);
}
p->next = NULL;
}
return head;
}
//0 sample等价,头尾结点都是奇数 356 4
//答案正确
//10 / 10
//1 头尾结点都是偶数 288 4
//答案错误
//0 / 2
//2 全是奇数 352 3
//答案错误
//0 / 2
//3 全是偶数 384 4
//段错误
//0 / 2
//4 只有一个奇数结点 320 4
//答案正确
//2 / 2
//5 只有一个偶数结点 284 5
//段错误
//0 / 2
struct ListNode* getodd(struct ListNode** L)
{
//L是链表头节点的地址的地址
struct ListNode* head = NULL;
struct ListNode* ps = NULL;//用来建立新的链表的
struct ListNode* pt = NULL;//用来存储前一个位置
struct ListNode* p = *L;//用来表示目前在原链表的位置
pt = p;
int flag = 0;
//判断链表中是否存在满足条件的节点的
while (p != NULL && flag == 0)
{
if (p->data % 2 == 0)
{
pt = p;
p = p->next;
}
else if (p->data % 2 == 1 && p ==(*L))
{
*L=(*L)->next;//如果原链表的头节点就要排除记得改变头节点的位置
ps = malloc(sizeof(struct ListNode));
head = ps;
ps->data = p->data;
p = p->next;
flag = 1;
}
else if(p->data % 2 == 1 && p!=(*L))
{
ps = malloc(sizeof(struct ListNode));
head = ps;
ps->data = p->data;
pt->next = p->next;
p = p->next;
flag = 1;
}
}
while (p != NULL)
{
if (p->data % 2 == 0)
{
pt = p;
p = p->next;
}
else if(p->data%2==1&&p==(*L))
{
*L = (*L)->next;
ps->next = malloc(sizeof(struct ListNode));
ps = ps->next;
ps->data = p->data;
pt->next = p->next;
p = p->next;
}
else
{
ps->next = malloc(sizeof(struct ListNode));
ps = ps->next;
ps->data = p->data;
pt->next = p->next;
p = p->next;
}
}
if (flag == 0)
{
return NULL;
}
ps->next = NULL;
return head;
}