1.设线性表L=(a1,a2,a3,…,a[n-2],a[n-1],an)采用带头结点的单链表保存,链表中结点定义如下:
typedef struct node{
int data;
struct node* next;
}NODE;
请设计一个空间复杂度为O(1)且时间上尽可能高效的算法,重新排列L中的个结点得到线性表L’=(a1,an,a2,a[n-1],a3,a[n-2],…)。
要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用c或c++语言描述算法,关键之处给出注释。
(3)说明你所设计的算法的时间复杂度。【2019年全国试题41(13)分】
答:(1)将原有链表从中间分为两部分,分别是(a1,a2,a3,…a[n/2])和(a[n/2+1],a[n/2+2],…,a[n])。将后一部分链表逆置,再将两个链表合并。
(2)核心语句
int i=1;
p=head->next; //设head是指向带头结点的单链表的指针
while(i<n/2){ //n为元素个数(题目有提示)
p=p->next;//找到两个链表的分界点,即中间结点
i++;
}
r=p->next; //r即为第二个链表的头结点
p->next=null;//p结点是前一半的尾结点
q=null; //为逆置做准备,q指向逆置表的首元结点
while(r){//链表逆置
p=r->n