封装链表:
尾添加的效率低、非法下标的判断效率也非常低
1、单链表
结点:
数据域
指针域
单链表数据项:
头结点
尾结点
结点数量
2、静态链表
结点:
数据域
游标
静态链表的结点存储在连续的内存中,通过游标来访问下一个结点
这种链表在插入删除时时需要修改游标的值,而不用申请、释放结点内存就可以达到类似链式结构的效果
牺牲了随机访问的功能、也没达到链表动态申请内存的效果,只是给没有指针的编程语言实现链表的一种方式,适用范围不大
3、循环链表
链表的最后一个结点的next不再指向NULL,而是指向头结点,这种链表称为单向循环链表,简称循环链表,它好处是可以通过任意结点来遍历整个链表
4、双向链表
结点:
前驱指针 prev
数据域
后继指针 next
数据项:
头结点
结点数量
特点:
1、在任意结点都可以遍历整个链表
2、相比单链表,删除、插入更直接
3、已知结点位置,可以选择从前往后或者从后往前遍历,提高链表的访问效率
5、Linux内核通用链表
链表的结点不能包含万物,那么就让万物来包含结点
// 计算结构成员member所在结构中的距离第一个成员地址编号的差值
#define offset(type,member) \
((int)&(((type*)0)->member))
// 计算返回结构成员指针所在结构变量的首地址
#define node_to_obj(node,type,member)\
((type*)((void*)node-offset(type,member)))
关于链表的常考笔试面试题:
1、单链表逆序,在原链表数据的基础上进行调整
2、找出单链表的倒数第n个结点
3、判断链表中是否有环
4、找出环形链表的入口
5、合并两个有序链表,合并后依然有序
6、判断两个链表是否是Y型链表,找出相交点