线性表习题

  • 给定n个数据元素,逐个输入,建立一个有序单链表的时间复杂度是o(n^2)

  • 设线性表非空,可以在o(1)时间内在表尾插入一个新结点的方法有:
    -带表头结点的单循环链表,一个链表指针指向表头结点(在表头结点后插入一个新结点然后交换这个结点与表头结点);
    -不带表头结点的单循环链表,一个链表指针指向表的第一个节点。

  • 若要在o(1)时间复杂度上实现两个循环单链表头尾相接,则对应两个循环单链表应设置一个指针,分别指向各自的尾结点。

  • 若需要对线性表中保存的无序数据按关键字进行查找,顺序表、动态链表、静态链表的查找效率没有区别。

题目:线性表中元素递增有序且按顺序存储于计算机内。设计算法完成下述功能:用最少时间把所有值为负数的元素移到全部正数值元素前边的算法。

int Rearrange(int a[],int n){
	int i=0,j=n-1;//i,j初始指向线性表的第一个和第n个元素
	int t=a[0];//暂存枢轴元素
	while(i<j){
	while(a[j]>0) j--;//如果当前元素大于0,j前移
	a[i]=a[j];
	i++;//负数前移
	while(a[i]<0) i++;//如果当前元素小于0,i后移
	a[j]=a[i];
	j--;//正数后移
}
a[i]=t;//将第一元素放到最终位置
}
  • 时间复杂度为o(n),空间复杂度为o(1)

题目:已知不带头结点的线性链表list,请写一算法,将该链表按节点数据域的值的大小从小到大重新连接。要求链接过程中不得使用除该链表以外的任何链结点空间。
【分析】链表的排序采用直接排序比较方便,即首先假定第一个节点有序,然后从第二个节点开始,依次插入到前面有序链表中,最终达到整个链表有序。

LinkList LinkListSort(LinkList& list){//list是不带头结点的线性链表
	LNode* p=list->next;//p是工作指针,指向待排序的当前元素
	list->next=NULL;//假定第一个元素有序,即链表中现在只有一个结点
while(p!=NULL){
	r=p->next;//r是p的后继
	q=list;
	if(q->data>p->data){//处理待排序结点p比第一个元素结点小的情况
		p->next=list;
		list=p;//链表指针指向最小元素
	}
	else{//查找元素值最小的结点
		while(q->next!=NULL&&q->next->data<p->data)
			q=q->next;
			p->next=q->next;//将当前排序结点插入有序链表中
			q->next=p;
	}
		p=r;//p指向下一个待排序结点
	}
}
LinkList LinkListSort(LinkList& list){//list是带头结点的线性链表
	LNode* p=list->next;//p指向第一个元素结点
	list->next=NULL;//链表初始化为空
while(p!=NULL){
	r=p->next;//保存后继
	q=list;
		while(q->next!=NULL&&q->next->data<p->data)
			q=q->next;
			p->next=q->next;//将当前排序结点插入有序链表中
			q->next=p;
		p=r;//p指向下一个待排序结点
	}
}

题目:Head为一个包含n个数据元素的带头结点的单链表,P1是一个包含整数(小于n)的递增的有序链表。编写一个算法,它将从Head中删除P1中所有整数所代表的序号的元素。例如:Head={a1,a2,a3,a4,a5,a6,a7},P1={1,4,6},则删除后的Head={a2,a3,a5,a7}
【分析】本题涉及到的基本操作有:链表的遍历、按值查找、删除等。

delete(LinkList &Head,LinkList P1){
	LNode*s=Head,*p=P1,*q;
	int i=1;//表示s后继元素的序号
	while(p){
	for(;i<p->data;i++)
	s=s->next;//将s移到要删除元素的前驱位置
	q=s->next;
	s->next=q->next;//删除s的后继元素
	free q;
	i++;
	p=p->next;
	}
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值