最近在给班里学生串讲前面学的数据结构知识:
在串讲过程中暴露不少问题,例如:顺序表和链表在操作复杂度方面,出现很多学生不能理解的情况,特别在秘密花园再梳理一下,此篇博文仅送给有缘人:
链表部分:时间关系仅以单向链表为例说明
单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
单向链表图示
- 表元素域elem用来存放具体的数据。
- 链接域next用来存放下一个节点的位置(python中的标识)
- 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。
单向链表的插入和删除操作简单分析
- 链表的头部插入数据:
- 链表的尾部插入数据和头部插入数据原理相似,在这里不过分强调;
- 接下来我们来看一下,随机指定位置插入;
- 链表中node节点删除
上面几张图如果大家都能理解,猜测大家已经对链表知识点有一个比较深刻的认知;
顺序表部分:
- 先看顺序表的结构
一个顺序表的完整信息包括两部分,一部分是表中的元素集合,另一部分是为实现正确操作而需记录的信息,即有关表的整体情况的信息,这部分信息主要包括元素存储区的容量和当前表中已有的元素个数两项.
所以在顺序表中,一旦出现删除或者(随机)指定位置添加数据等情况,整个顺序表是需要进行一系列的前移或者后移操作的,当然这个还要结合我们操作的顺序标的具体位置逐一分析;
划重点:接下来我们看一下链表与顺序表的各种操作复杂度对比
操作 | 链表 | 顺序表 |
---|---|---|
访问元素 | O(n) | O(1) |
在头部插入/删除 | O(1) | O(n) |
在尾部插入/删除 | O(n) | O(1) |
在中间插入/删除 | O(n) | O(n) |
注意:以上这些问题的理解需要建立在大家能够对顺序表和链表有一个整理比较完善的理解;
上表中,虽然表面看起来复杂度都是 O(n),但是链表和顺序表在插入和删除时进行的是完全不同的操作。链表的主要耗时操作是遍历查找,删除和插入操作本身的复杂度是O(1)。顺序表查找很快,主要耗时的操作是拷贝覆盖。因为除了目标元素在尾部的特殊情况,顺序表进行插入和删除时需要对操作点之后的所有元素进行前后移位操作,只能通过拷贝和覆盖的方法进行。
补充:
- 首先顺序表在数据读取方面是随机读取的逻辑,所以时间复杂度仅为O(1)。
- 链表失去了顺序表随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大,但对存储空间的使用要相对灵活。
说明:以上观点仅为个人拙见,写此篇博文的核心目的还是要好好梳理下链表和顺序表的一些具体区别。在加深自己理解和记忆的同时也能分享给众多有心人,实数人生幸事。如果博文中有错误和瑕疵欢迎各位在评论区留言指正,如果您觉得此篇博文为您带来了帮助,欢迎关注、点赞、收藏、转发!!!