【王道数据结构】【chapter2线性表】【P44t16】

设有一个长度为n(n为偶数)的不带头结点的单链表且结点值都大于0,设计算法求这个单链表的最大的孪生和。孪生和的定义为一个结点值与其孪生结点值的和,对于第i个结点(从0开始),其孪生结点为第n-i-1个结点。

#include <iostream>
#include<time.h>
#include <stdlib.h>
typedef  struct node{
    int data;
    node* next;
}node,*list;

list Buynewnode(int x)
{
    list tmp=new node;
    tmp->next= nullptr;
    tmp->data=x;
    return tmp;
}


int twist(list head)
{
    list h1=head,h2=head;
    while(h2)
    {
        h1=h1->next;
        h2=h2->next;
        if(h2) h2=h2->next;
        else break;
    }
    //h1是第二条链表的开头的结点
    //如果节点的个数是偶数个,那么将会正好是后一半的开始的结点
    //如果节点的个数是奇数个的话,将会是正中间的那个结点
    //本题已经说明是偶数个结点。
    list p2=h1->next;
    h1->next= nullptr;
    while(p2)
    {
        list tmp=p2->next;
        p2->next=h1;
        h1=p2;p2=tmp;
    }
    int record=-1;
    list p3=head,p4=h1;
    while(p4)
    {
        record=record>(p3->data+p4->data)?record:(p3->data+p4->data);
        p3=p3->next,p4=p4->next;
    }
    return record;

}
int main() {
    srand(time(nullptr));
    list head= nullptr;
    list pointer=head;
    for(int i=0;i<10;i++)
    {
        if(head== nullptr) head=pointer= Buynewnode(i+rand()%20);
        else pointer=pointer->next= Buynewnode(i+1+rand()%20);
    }
    for(pointer=head;pointer!= nullptr;pointer=pointer->next) {
        printf("%3d",pointer->data);
    }
    puts("");


    printf("%d\n", twist(head));
    return 0;
}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桜キャンドル淵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值