PTA.奇数值结点链表(C语言)

题干:

裁判程序:

样例:

先说思路吧,我想的是把原链表分为奇数链表和偶数链表,但不去开辟空间(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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值