PTA的习题
借鉴了一下网上几位大佬代码(可能我看的不多= =),发现都是将传入的链表里面的元素,拿出并选择性地放入两个不同的新链表中。
我写的代码思想是,只用建立一个用于存储奇数的新链表,而对传入的链表进行删除奇数操作。(里面一些代码可以自行优化,我用的都不是太难理解的代码)
直接上代码:(解释见注释)
struct ListNode *readlist()
{
struct ListNode *head,*p1,*p2;
int n=0;
head = NULL;
p1 = p2 = (struct ListNode*)malloc(sizeof(struct ListNode));
scanf("%d",&p1->data);
while(p1->data!=-1)
{
n++;
if(n==1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct ListNode*)malloc(sizeof(struct ListNode));
scanf("%d",&p1->data);
}
p2->next = NULL;
return head;
}
struct ListNode *getodd( struct ListNode **L )
{
struct ListNode *p1,*p2,*p3,*head=NULL;
int m=0;
p1 = (*L);
while(p1!=NULL)
{
if(p1->data%2!=0)//奇数
{
//将该元素”复制粘贴“进新的链表
m++;
struct ListNode *n = (struct ListNode*)malloc(sizeof(struct ListNode));
if(n!=NULL)
{
n->data = p1->data;
n->next = NULL;
}
else
exit(1);//exit(1)是异常退出,exit(0)正常退出
if(m==1)//头指针,也可以判断head是否为空来进行判断
{
head = n;
p3 = head;
}
else
{
p3->next = n;
p3 = p3->next;
}
//原链表进行删除操作
if(p1==(*L))
(*L) = p1->next;
else
p2->next = p1->next;
}
else//偶数的话留一个p2”守家“
{
p2 = p1;
}
//继续走
p1 = p1->next;
}
*L = *L;
return head;
}
测试了,应该莫得问题。
如有错误,欢迎指出!这也算是我的第二篇博客吧,没啥经验。