单链表
单链表的插入
最坏的情况是在表尾插入,故时间复杂度O(n),空间复杂度O(1)。
单链表要小心断链,防止“临场掉链子”。
注意:在链表的第p个位置上插入一个元素的含义我们假定是,该插入操作完成后新结点在链表中 的位置是p。
单链表的删除
最坏情况就是需要删除单链表的最后一个结点,时间复杂度是O(n),空间复杂度O(1)。
单链表的整表创建
其实就是动态生成链表的过程,分头插法和尾插法,记“头逆尾顺”。头插法生成的是逆序的,尾插法生成的是顺序的。
单链表的整表删除
时间复杂度是O(n),空间复杂度O(1)
思路:用一个临时指针变量指向当前结点的下一个结点,然后删除当前结点,接着将临时指针指向的结点作为当前结点,重复上述过程直到所有结点均被删除为止。
单链表结构VS顺序存储结构
1)若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。
2)当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构。
静态链表
用数组描述的链表。
1)数据域data---用来存放数据元素。
2)cur相当于单链表中的next指针,存放该元素的后继在数组中的下标,cur叫游标。
注意:数组第一个和最后一个元素作为特殊元素处理,不存数据。
即下标为0的元素的cur就存放备用链表的第一个结点的下标,(未被使用的数组元素称为 备用链表)。
即最后一个的cur存放第一个有数值的元素的下标,相当于头结点作用,space[0].cur为头指针。
循环链表
循环的判断条件:判断p->next不等于头结点,则循环未结束。
在循环链表中不存在具有NULL指针的结点。
循环单链表的最大优点:从任意结点出发都可访问到链表中的每一个元素。
遍历整个长度为n的链表,时间复杂度是O(n),空间复杂度O(1),一个辅助指针变量,一个计数变量。
双向链表
插入操作,顺序很重要,还是要警惕断链,时间复杂度是O(n),空间复杂度O(1)。
删除操作: 时间复杂度是O(n),空间复杂度O(1),因为可能需要扫描整个长度为n的链表
带头结点的双向循环链表L为空表的条件是:
L->prior==L->next&&L->next==L
带头结点的双循环链表L中只有一个元素结点的条件是:
L->next->next==L&&L->prior->prior==L &&L->next!=L