习题11-7 奇数值结点链表 (20分)

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;
}

测试了,应该莫得问题。
在这里插入图片描述
如有错误,欢迎指出!这也算是我的第二篇博客吧,没啥经验。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值