1.脑图
2.表示方法
按照数据结构概述所说,线性表有两种表示方法分别是顺序表示和链式表示, 链表就是链式表示的典型。
我们知道链式表示是分配了n块内存空间,可以认为彼此不连续,所以不能用偏移量去定位每个元素。
下面就先说最简单的 单向链表 :
如果每个数据元素能有一个指针指向下一个元素的话,那么只需要知道第一个数据元素就能一个一个的遍历整个链表了,这就是单向链表。
对于每个链表元素我们称之为 节点 ,每个节点都有两个域: 数据域& 指针域
数据域 就是数据元素所在的区域, 而指针域则是存储指向另一个节点的指针的区域。
对于单向链表,它的指针域有一个指针指向下一个节点的内存地址。
需要注意的是:
头节点 指向表中第一个节点,它本身的数据域不带数据,所以判断链表NULL的方法是判断头结点的指针是否为空。
最后一个节点的指针应指向NULL。
对于单向链表,它有一个问题。那就是当你获取链表中第n个元素(n>1)时,想获取它的上一个指针,需要重新遍历一遍链表,算法复杂度O(n)。为了应对这个问题,我们引入了双向链表。
双向链表
单向链表每个结点的指针域只有一个指向下一个结点的指针,现在在上面加上一个指向前一个结点的指针就变成了双向链表。这样,要寻找前一个结点只需要O(1)就可以了。
还有一类形式的链表,就是 循环链表 。
它在单向链表上做了一点小改动,在单向链表中最后一个结点的指针是指向NULL的,可是循环链表中最后一个结点的指针是指向第一个结点的。
栈和队列都是特殊的线性表,因为他们的操作集合是小于完整的线性表的,它们在线性表之上加上了限制条件。
栈
栈最大的特征就是 LIFO (Last In First Out),也就是后入先出。最后入栈的元素最先出栈。
队列
队列最大的特征和栈相反,是FIFO(First In First Out),也就是先入先出。最先入队的元素最先出队。
字符串是一类特别的线性表,它的所有元素都是单个字符,针对字符串,最重要的就是寻找子串也就是字符串匹配算法了,后面会涉及。
学过C/C++的人都会无比熟悉,也不废话了。进阶是二维数组也就是矩阵,这个会有一些要点。
广义表就是线性表的扩展,我们知道线性表所有的元素都是同类的,但是广义表可以使得每个元素都是不同类型。