线性表之四:顺序表vs链式表即常用操作(最值、逆置、归并)

一、顺序表与链式表的区别

1.存取方式
单链表:顺序存取
顺序表:随机存取,顺序存取
2.逻辑结构与物理结构
单链表:逻辑相邻物理不一定相邻,通过指针表示逻辑关系
顺序表:逻辑相邻物理也相邻,通过相邻表示逻辑关系
3.基本操作
插入与删除:
单链表:O(1)(结点指针已知)O(n)(结点指针未知)
顺序表:O(n),需要大量移动元素
查找:
按值查找:单链表与顺序表(无序)都为O(n)
按序查找:单链表O(n),顺序表O(1)
4.内存空间:
顺序存储:静态分配与非静态都需要预先分配
链式存储:需要时分配结点空间即可,但指针需要额外空间

二、如何选择线性表的存储结构

111.存储
1.规模难以估计:单链表
2.存储密度大:顺序表
222.效率
3.按序号访问:顺序表
4.插入和删除:单链表
333.环境
5.基于数组:顺序表
6.基于指针:单链表
444.状态
稳定:顺序表
动态:单链表

三、常用操作

1.求最值

顺序表

int min=L[0];
int max=L[0];
for(int i=0;i<n;i++){
if(min>L[i])min=L[i];
if(max<L[i])max=L[i];
}

链表

int min=p->next->data;
int max=p>next->data;
for(;p!=NULL;p=p->next){
if(min>p->data)min=p->data;
if(max<p->data)max=p->data;
}
2.逆置

顺序表

int i=0;
int j=n-1;
while(i<j){
temp=L[i];
L[i]=L[j];
L[j]=temp;
}

链表

//p为头结点,把第一个结点循环移动到尾结点r的下一个结点
while(p->next!=r){
temp=p->next;
p->next=temp->next;
r->next=temp;
}
3.归并

将两个线性表按顺序合并一起

顺序表(数组按顺序排列)

int i=0,j=0;
int k=0;
for(;i<L1_Size&&j<L2_Size;k++){
if(L1[i]<L2[j])
L[k]=L1[i++];
else 
L[k]=L2[j++];
}
while(i<L1_Size)
 L[k++]=L1[i++];
while(j<L2_Size)
L[k++]=L2[j++];

链表(p为L1指针,q为L2指针)

while(p->next!=NULL&&q->next!=NULL){
if(p->next->data<q->next->data){
r->next=p->next;
p->next=p->next->next;
r=r->next;
}
else{
r->next=q->next;
q->next=q->next->next;
r=r->next;
}}
if(p->next!==NULL)r->next=p->next;
if(q->next!=NULL)r->next=q->next;
free(p);
free(q);

小结:三种操作顺序表与链式表的时间复杂度均为O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值