1.单链表
所谓单链表,是指数据结点是单向排列的。它包含两个域,一个信息域和一个指针域。
单链表可以解决顺序表需要大量的连续存储空间的缺点,但单链表附加指针域,也带来了浪费存储空间的缺点。
headNULL时则表示一个空链表
此外为了操作上的方便,可以在单链表第一个结点之前附加一个结点,称为头结点。
头结点的指针域指向链表的第一个结点,数据域可以不设任何信息,也可以存放链表元素个数等信息,带头结点的单链表head为空的判定条件为:
head->nextNULL。
单链表的插入、删除的时间复杂度均为O(n),单链表取数据元素操作的时间复杂度也为O(n)。
2.顺序表
将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。
1.顺序表是线性表,逻辑结构与存储位置吻合。
2.一般采用数组存储。
3.顺序的分类:
顺序表具有头插法,尾插法,从中间任何位置插入,头删法,尾删法,从中间任何位置删除。
3.顺序表和链表的比较
1)存取方式
顺序表可以顺序存取,也可以随机存取,链表只能从表头顺序存取元素。
2)查找、插入和删除操作
对于按值查找,当顺序表在无序的情况下,两者的时间复杂度均为O(n);而当顺序表有序的时候,可以折半查找,此时的时间复杂度为O(logn);对于按序号查找,顺序表支持随机访问,时间复杂度仅为O(1),而链表的平均时间复杂度为O(n)。顺序表的插入、删除操作,平均需要移动半个表厂的元素,链表的插入、删除操作时,只需要修改相关结点的指针域即可。
4.双链表
单链表访问后继结点的时间复杂度为O(1),访问前继结点的时间复杂度为O(n)。为了解决这个问题引入了双链表。
常见的链表还有循环单链表与循环双链表。
循环单链表和单链表的区别在于,表中最后一个结点的指针不是NULL,而改为指向链表头,从而整个链表形成一个环。
5.队列
队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端删除元素。
队列的顺序存储是指分配一块连续的存储单元(通常用数组实现)存放队列中的元素,并设置两个整型变量分别指示队头元素(head)和队尾元素(tail)的存储位置,分别称为队头指针和队尾指针。
用数组实现队列的话,循环队列一般是必需的。我们用2个下标为head 和tail 来标记队头和队尾的位置,如果出队的话head+1,入队的话tail+1,这样整个队列在数组中的位置就会慢慢向右移动,不做处理的话很快会到达数组的尾端。因此,循环队列需要采取这样的操作,当队头或者队尾超出存储队列的预设长度时,就把它们设置为0,等于再从数组的左边开始向右增长,形成卷绕。
开始时,我们把head 和tail初始化为0,这时的队列时空的。
head==tail可以用来判断一个队列是否为空。
判断队列满有两种情况:
1)此时head为0,tail=length-1,意味着已经N-1个对象在队列里。
2)head 大于0,则队列满的条件为head=tail+1,这种情况就是由于卷绕造成的。
6.栈和队列的比较
1)队列先进先出,栈先进后出
2)对插入和删除操作的“限定”。栈是限定只能在表的一端进行插入和删除操作的线性表。队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
来源:CSDN
作者:深度鸟
链接:https://blog.csdn.net/weixin_41767962/article/details/103638728