线性表算法设计题1

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值