顺序表
顺序表的本质是一个由数组构成的一整片且连续的空间,它的特点就是在物理空间上是连续的,并且支持下标访问,也可以进行随机访问。但是由于是由数组构成的结构,所以对数据的增删效率低,需要挪动后面的一堆元素并且数组的大小不支持随意改动,故而导致空间大小是固定的,空间满了就无法继续添加元素,空间未满时也会浪费不少的空间。所以顺序表一般用于需要高效存储和频繁访问元素的场景。
链表
链表比起顺序表就有很大的不同,它实际上是由两个部分组成:一个是其存储的数据,另一个则是指向链表下一个节点的指针。这也导致了它在内存中的存储模式与顺序表有很大的不同,它的空间是非连续的,用指针将各个节点相连,从而实现链式结构。链表的增删会比顺序表简单很多,因为它的空间为非连续的,删除或增加数据时只要进行开辟或释放节点,然后调整指针的指向就可以操作。此外它的灵活性也更高,因为它是每次增加或删除数据时才进行对应的开辟和释放空间的操作,就不容易出现空间浪费和不足的问题。但是链表比起顺序表也有缺陷,就是由于空间不连续,所以导致链表查找和访问数据效率低,往往都需要遍历链表才能定位到需要访问的位置。
链表的两种形式
链表分为两种形式:单链表以及双链表,这两种链表之间也有着不小的差别
| 链表类型 | 单链表(单向不循环不带头) | 双链表(双向循环带头) |
| 有无头节点 | 无 | 有 |
| 是否循环 | 否 | 是 |
| 指针指向 | 只能指向后一项 | 同时指向前一项和后一项 |
|
能否直接 找到尾节点 | 不能 | 能 |
单链表比较好理解,就是只能一个方向进行查找,首节点就是正常节点,尾节点指向空。双链表就是可以双向进行查找,它拥有两个指针,一个指向前一个节点,一个指向后一个节点,且拥有一个头节点,俗称哨兵位,哨兵位的作用就是标志着这个位置为头节点,它本身并不存储任何数据,只有两个指针,一个指向后一节点,也就是实际存数据的节点的头一位节点,另一个指针则向后指向尾节点,形成一个闭环。
双向链表比起单链表来说有很多好处,其一是能很快的找到尾节点,因为双链表的哨兵位直接指向尾节点,其二是双链表的删除操作更为简便,因为在单链表中我们是无法定位到某一节点的前一节点的,所以在删除操作时,我们要先记录下前一节点,让前一节点的指针指向要删除节点的下一节点,然后才能进行删除操作,而双链表中我们直接就能从被删除节点定位到前一节点,比单链表方便了不少。
顺序表与链表的优劣对比
| 结构类型 | 顺序表 | 链表 |
|
空间是否连续 | 是 | 否 |
| 是否支持随机访问 | 支持O(1) | 不支持O(N) |
| 能否在任意位置插入或删除数据 | 可能需要移动数据,效率低 | 只需修改指针指向 |
| 插入 | 空间固定,不够时需扩容 | 空间不固定,即插即扩 |
| 应用场景 | 元素高效存储和频繁访问 | 任意位置插入和删除频繁 |
878



被折叠的 条评论
为什么被折叠?



