目录:
前言
1.存储空间
2.访问元素
3.插入/删除元素
4.使用
总结
前言;
① 首先明确一点,对于数据的存储结构,无论是数组还是列表,并没有优劣之分,只取决于你的需求。
② 为了方便后面的讨论,在这里先假设我们要存储整形数据。
③ 数组与指针的存储形式:
数组是连续存储
链表是单独存储,每个存储的元素后面跟着下一个元素位置的指针
(你要知道数组首元素是arr[0],这可能是数组越界最常见错误)
④指针总是占用四个字节。
下面我们分别从:存储空间,访问元素,插入/删除元素 ,使用,四方面来对比两者的优劣。
1.存储空间
由于不知道我们要存储几个整形,先创立一个整形数组arr[6]
)
现在假设我们要存储 : 1,2,3,4
那么数组和链表是存储结构将会是:
情况一:数组空间有空余且插入元素时
数组所占空间 : 4 × 6 =24
链表所占空间: (4+4)× 4 =32
此时链表所占用空间更多,但数组有空间未利用,并且你还要考虑另一种情形:那就是如果元素类型特别复杂,占用空间很大,如一个元素占16个字节,那么情况就变为了:
数组所占空间 :16 × 6 =96
链表所占空间: (16+4)× 4 =80
这种情况下,反而是链表更节省空间。
情况二:数组空间无空余且插入元素时
由于数组里内空间不足,所以需要创建更大尺寸的数组,并复制内容,而链表不用。
2.访问元素
在数组里想要访问某个元素,如访问第i个元素,只需用首元素地址+i×4 ,得出某个元素地址直接访问,时间复杂度为O(1);
在链表中想要访问某个元素,需要从第一个元素开始一个一个的往下找,时间复杂度为O(n);
3.插入/删除元素
插入与删除情况相同,下面只以一种举例
情况一:插入首元素
数组:需将每个元素向后移动一位,花费的时间和数组大小成正比,时间复杂度为O(n)
链表:只需创立一个新节点,并调整头指针,花费的时间不取决于数组大小,而是恒定的,时间复杂度为O(1);
情况二:在末尾插入元素
数组:如果数组未满时,直接插入即可,时间复杂度为O(1)
如果数组已满,那不得不创建新的数组,并复制,时间复杂度为O(n)
链表:还是需要从第一个元素开始往后找,遍历整个链表找个最后的元素,再创建下一个节点,时间复杂度为O(n)
情况三:在中间插入元素
数组:需要移动一半的元素,时间复杂度为O(n)
链表:从第一个元素开始找,时间复杂度为O(n)、
4.使用
链表的使用不当可能会出现内存泄漏等故障,数组相对安全。
总结:
1.链表只在某些情况下空间利用率会优于数组
2.如果从访问元素的速度来说,数组更快
3.数组或列表,无优劣之分,只取决于你的需求。