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