顺序表和链表都是线性表的一种,是数据机构中较为基础的部分,线性表在逻辑上是线性结构,是一条连续的直线,但在物理上并不一定是连续的。
顺序表是以数组的方式来实现的,用物理地址连续的存储单元存储数据,通过下标来记录数据的位置,所以顺序表在物理上和逻辑上都是连续的。顺序表和数组最大的区别在于,对顺序表的增删查改所使用的方法都在一个类里面,使用的时候可以直接面向对象。
链表是通过一个个单独的节点链接而成,在物理上并不一定是连续的,但在逻辑上是连续的。链表有几种基本的分类,单双向、有无头和是否有循环。如果是单向链表,那么节点一定会有两个最基本的域,一个是值域,用来存放数据,另一个域用来存放下一个节点的地址。而如果是双向链表,链表中的节点除了能够找到自身后面的节点,还要能够找到前面的节点,那么就会有最少三个域,多的那个域存放的就是前面一个节点的地址。
顺序表和链表的顺序表的数据增删相对链表来说就要比较麻烦。如果只是在顺序表的最末尾增删数据还比较简单,增删数据之后只需要增删一个数据的下标就行。可如果是在顺序表的其他位置进行增删,因为必须要保证物理地址上的连续,并且用下标来标记和查找数据,一个数据的增删就需要整体挪动其他数据的位置,会比较的麻烦。而且因为底层的实现方式是数组,而数组就会存在容量问题,因此增加数据的时候需要检查顺序表是否存满,如果存满就要进行扩容,而扩容就有可能导致空间浪费。顺序表对随机位置数据的查找就比链表要方便很多了,要哪个位置的数据都能根据下标快速找到。
链表由于是多个节点链接而成,对于数据的增删就会非常方便,找到需要修改的数据,将前后位置的节点存放的地址进行修改就可以完成,不需要对数据进行大量的移位。存一个数据就创建一个节点来存放,删一个数据就删一个节点,也就不存在存满需要扩容的情况,不容易造成空间浪费。而链表物理上的不连续就会导致数据查找比较麻烦,因为想要知道一个节点存放的数据,就必须要通过上一个节点存放的地址来找到这个节点,这样要查找随机位置的数据时,就需要遍历链表。