线性表的顺序存储结构和链式存储结构
顺序存储结构:整表创建可以用数组的初始化直观理解,存储数据集中
单链表:数据可以分散在内存各个角落,增长也是动态的,占用的空间大小
和位置是不需要预先分配规划的,可以根据系统情况和实际的需求
及时生成。
优缺点:
顺序存储结构:用一段连续的存储单元依次存储线性表的数据元素(如数组)
单链表:采用链式存储结构,用一组任意的存储单元存放线性表的元素。
时间性能:
查找:顺序存储结构0(1)
单链表0(n)
插入和删除
顺序存储结构需要平均移动表长一半的的元素0(n)
单链表在计算出某位置的指针后插入和删除时间为0(1)
空间性能:
顺序存储结构需要预先分配空间,分大了浪费,分小了容易内存溢出。
单链表不需要分配存储空间,只要有空间就可以分配,元素个数也不会受到限制
综上:
若线性表需要频繁查找,很少进行插入和删除操作,适合用顺序存储结构。
若需要频繁插入和删除时,适合采用单链表结构;
——–静态链表——-
1、我们队数组的第一个和最后一个元素做特殊处理,他们的data不存放数据。
2、我们通常把未使用的数组元素称为备用链表
3、数组的第一个元素,即下表为0的那个元素的cur就存放备用链表的第一个节点的下标
4、数组的最后一个元素,即下表为MAXSIZE-1的cur则存放第一个有数值的元素的下表,相
当于单链表的头结点的作用。
优点:在插入和删除操作时,只需要修改游标,不需要移动 元素,从而改进了在顺序存储结构中
的插入和删除操作需要移动大量元素的缺点。
缺点:没有解决连续存储分配(数组)带来的表长难以确定的问题。
失去了顺序存储结构随机存取的特性。
总的来说,静态链表其实是为了给没有指针的编程语言设计的一种实现单链表功能
的方法。
题目:快速找到未知长度单链表的中间节点。
方法一:首先遍历单链表确定单链表的长度L,然后再次从头结点循环L/2次
找到单链表的中间节点。时间复杂度:3L/2
方法二:利用快慢指针的原理,设置两个指针*fast, *min都指向单链表的头节点
其中*fast的移动速度是*min的2倍,当*fast指向尾节点的时候,*min正
好就在中间了这也是标尺的思想。
——————循环链表——————-
1、终端节点用尾指针rear指示
题目:实现两个线性表(a1, a2, …., an)和(b1, b2, …, bm)连接成一个线性表
(a1, a2, …, an, b1, b2,…, bm)的运算。
方法一:若在单链表或头指针表示的单链表上做这种操作,都需要遍历第一个链表,找到接节点
an,然后将节点b1连到an后面,执行时间是0(n)
方法二:若在尾指针表示的单链表上实现,只需修改指针,无需遍历,执行时间为0(1)
题目:判断单链表中是否有环
方法一:使用p,q两个指针,p总是向前走,但q每次都从头开始走,对于每个节点,看p走的步数
是否和q一样
方法二:使用q,p两个指针,p每次向前走一步,q每次向前走两步,若在某个时候p == q则说明存在环。
———–双向链表————–
多了一个前驱节点的指针prior