设有一个长度为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;
}