链表是最基本的线性数据结构之一,数组也是一种线性结构,我们使用链表的目的是为了克服数组结构的一些弱点和局限性。(数组的弱点是定义后不能去修改大小,插入和删除元素也很吃力,链表可以解决这些问题)。
数组在内存中的排列特征是元素一个紧挨着一个排列 ,优点是随机访问每个元素会很快,但大小不能扩张,插入删除不方便。如果我们要在数组中间插入一个元素,需要移动很多元素。
下面看链表:这里讲单链表:
对单链表而言它的每个单元都含有两项数据,一项数据用来 存储元素本身 ,另一个是 指针 ,指针将指向与自己类似的另一个对象, 链表的关键在于每个单元不用连续存储,可以分布在内存中的任何位置,这样内存分配就很灵活,添加单元时不需要与前一个单元有什么物理上的位置关系可以随意分配 ,在这些单元中都存在着一个指针,指向该单元的下一个单元 ,这样如果我们拿到了第一个元素就可以顺着找到所有的元素,其中最后一个元素的下一个指针是空指针 。
接下来在链表中做插入:
这次我们就可以把新插入的元素放在内存中任何位置,然后通过修改指针关系把这些散落在内存中的各个单元串联起来。这就是链表的插入和删除的方便性和优点。
所谓有优点就有缺点否则我们就没必要使用数组了, 单链表的缺点是随机访问很慢 ,例如我们要访问第三个元素,先要由head找第一个元素,然后沿着第一个元素找第二个,依次类推假如要找的是第1万个元素显然就要经过漫长的寻找过程,而 数组的长处正是链表的短处。
有时候 数据结构也未必要做到那么纯粹说这是一个数组那是一个链接,我们可以 灵活和综合的去使用各个结构的优点,比如我们可以做这样的结构,让每个链表的单元是一个小型的数组,例如我们用一个数组表达10万数据,我们可以把每100或1000元素这样的数组做成一个小单元然后用链表串起来,那么它就既有数组的优点又具有链表的优点,
数据结构经常是这样灵活的混合的应用,这里演示的仅仅是链表的基本结构,在实际使用过程中它会有许多变种。