先看下数据结构中一种重要的数据存储形式,链表,下面两段是来自百度百科:
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。
之前在学习单向链表时,对先进先出链表始终一知半解,昨天又看了关于数据结构单向链表的公开课,恍然大悟!可能是实践后让我更容易理解老师讲的内容吧~
要理解先进先出链表,先进后出链表,首先要明白,两种链表数据插入方式的差异,先进先出链表是在尾部插入,先进后出链表是在头部插入。这样是不是还不能理解,为啥这样就是先进先出了呢?下面就分步演示一下插入过程,就可以很明了了。
比如我们希望链表中存储1,2,3,4,5这样的数据,顺序固定,两种链表应该如何实现?
先看先进先出链表,先进先出是在尾部插入新的数据,所以,1->2->3->4->5依次插入,到第5次就完成了
再看先进后出:先进后出是在头部插入新的数据, 所以,5->4->3->2->1插入才能实现1->2->3->4->5的存储,这也就是为什么叫先进后出,5是第一个插入的,但却在队尾,最后才能被查询到。这样是不是更能理解上面的先进先出了呢!