从业两载有余,身为计算机专业毕业的,但是却要用阴差阳错这个此来形容自己走到这个领域。既来之则安之吧。此前一直在百度着代码,确实,作为一个java程序员(当然也包括其他高级语言),刚开始都是copy and paste。回到现实,想想自己美好的未来,一直这么下去吧,注定是是撸码届最底层的“农民工”。也许你有理由说,哪天我累了不在北漂了,回家做个小买卖,那好,既然早知结果为何不趁早呢。废话容易扯淡,开始我的第一篇。如有不对,请拍我!
线性表,为何称之为线性表呢?其中主要的原因是其存储的逻辑关系。
线性表:由N个数据元素组成的序列。(N≥0)如下图所示线性表的特征就是①:第一个元素没有前驱,称其为开始节点;②最后一个元素没有后继,称其为终端节点;③其余元素有且只有一个前驱和后继。
其中a1的后继为a2,an的前继为a n-1。
线性表的描述
线性表结构比较简单,,长度可以动态的去改变。支持对任意数据访问,查找。其主要包括的操作有,清空、判断是否为空、求线性表的长度、访问元素、插入、删除、查找、等。用java语言描述如下:
线性表的两种存储方式
一、线性表分顺序存储和链式存储。也分别称其为顺序表和链表。
①、顺序存储:开辟一块连续的地址存储单元,依次按照顺序存储各个元素数据。
如上图所示,只要知道顺序表中的基地址和每个存储单元所占的存储单元,那么就可以计算出任意第N个元素的地址:
Loc(an)= Loc(a0)+n × c
顺序表的特点:
①:顺序表中,逻辑相邻的元素,在物理存储上也是相邻的。
②:便于随机存储。
③:不便于插入和删除操作,因为你在任意一个第N个元素插入或者删除数据,那么其后面的元素都需要前移和后移。
顺序表的描述:
由于顺序表也是线性表的一种,线性表具有的清空,添加,删除等操作,这里不再赘述,主要用java语言来描述器插入操作的算法。如下图:
同理删除操作是往签移动。不再赘述。
②链表:链表分单链表和双链表以及环链表也就是循环链表。上面我们说过,顺序表便于随机访问,但是不便于插入和删除的操作。那边链式存储就解决了插入和删除操作。怎么实现的呢?就是每块的存储单元包括数据单元和指针单元,也叫做数据域和指针域。前继的指针域指向后驱的地址。其结构如下图:
如上图,通常为了唯一标识一个单链表会虚加一个head指针,标识起始节点的地址,有了头指针就可以得到任意一个节点。当我们删除一个元素时,只需修改删除位置的指针域将其指向删除位置下一个元素的数据域即可。链表存储个人理解在物理上没有连续的地址,相当于以空间换取时间。但是对于遍历查找就麻烦了,必须顺着他的指针挨个查找,为了解决此问题,又有了双向链表。
至于双向链表就是有三块存储单元,第一块存储单元前驱节点的地址,第二个为数据单元,第三个为后继节点的地址。
循环链表就是尾端点保存着起始节点的地址。
总结:对于面试有些面试官会问道:说说ArrayList和LinkedList区别,你可以回答一个查询快,一个增删快;那么面试官再问你,LinkedList为什么增删快?答案全在上面。