【数据结构】关于顺序表和链表的区别及访问方式

顺序表和链表的区别

1.顺序表和链表都具有增、删、查、改的相同功能,但算法复杂度却不相同。

增:
a) 顺序表往指定位置,不覆盖的添加一个值,后面的值日要往后移动,算法复杂度为O(n);
b) 链表往指定位置添加一个节点,需要从表头遍历到指定位置,算法复杂度为O(n),如果带有索引的节点,算法复杂度为O(1)。
删:
a) 顺序表指定位置,删除一个值时,需要将后面的值向前移动,算法复杂度为O(n);
b) 链表指定一个位置,删除一个时,如果没有对指定节点进行索引,需要从表头遍历到指定位置,然后将指定节点删除,算法复杂度为O(n), 如果对指定节点做索引,删除节点的算法复杂度为O(1)。
查:
a) 顺序表直接查询指定位置值算法复杂度为O(1);
b) 链表需要遍历节点到指定位置,算法复杂度为O(n);如果节点指定位置节点有索引,算法复杂度为O(1).
改:修改其实就是查找修改值的位置,再对值进行修改。
a) 顺序表的增和删表数量规模比较大时,平均移动一半的元素,效率不高。
b) 对于有索引的链表,添加和删除只需要O(1)算法复杂度,效率高。因此,链表用于频繁的添加和删除数据时,有优势。
2.从内存角度
(1)顺序表是由数组组成的线性表,数组是一组地址连续的单元存储块,分配于栈区,可以自动释放。
(2)链表是由不连续的地址节点组成的线性表,每个节点可以是一个单元的地址块或连续地址块,分配于堆区,节点必须手动释放。内存管理比较不方便。
在这里插入图片描述
.随机访问的条件:连续存储+每个单元的存储大小相同+数组在内存中的首地址已知。

顺序表可以从首地址和要访问元素的下标以及占用的空间大小计算出要访问元素的位置。

而链表是动态存储的,地址并不连续,两个元素之间到底有多大距离是未知的,只能通过指针域去确定下一个元素的位置,所以想要找到一个元素,只能从头去遍历,这样才能找到要访问元素的位置。

即使你知道链表的首地址和每个单元的大小,但由于两个单元之间不是连续存储的,不知道两个单元之间的内存大小,无法跟数组一样直接通过用户给出一个index通过公式直接计算内存地址(其他数据诸如数组单元大小和首地址系统已知)。这就导致了即使LinkedList有index也只能从头遍历,而不是通过公式计算出地址到内存去取数据。
在这里插入图片描述
随机访问是说你可以随意访问该数据结构中的任意一个节点,假设该数据结构有10个节点,你可以随意访问第1个到第10个节点。
对于列表而言,如果其存在10个节点,如果你要访问第5个节点,你只能从列表的头或者尾,依次遍历相邻的每一个节点;
对于vector而言,你可以直接利用[]操作符,直接访问[4],不需要遍历其他的节点。
这就是随机访问。

比如first是第一个元素的地址,现在想访问第N个元素。

随机访问:直接first+N,便可以得到第N个元素的地址,因为这些相邻元素是按顺序连续存储的。
比如普通数组就是可随机访问的。

而链表不支持随机访问,链表存储的元素,它们的存储地址也不是连续的,是随机的。
要想访问第N个元素,只能从second = first->next遍历第2个元素,然后再three = first->next遍历第3个元素… 这样一直到第N个元素。所以这样的访问速度就没有随机访问快。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值