链表相关面试题(基础篇)
链表相关面试题(基础篇)
链表是一种常见的基础数据结构,是一种线性表,是一种物理存储单元上非连续、非顺序的存储结构。链表由一系列节点组成,节点可以在运行时动态生成。每个节点包括存储数据元素的数据域和存储下一个节点地址的指针域两个部分。相比于线性表顺序结构,操作复杂。数据元素的逻辑顺序也是通过链表中的指针链接次序实现的。
线性表的链式存储特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此为了表示每个数据元素与其直接后继数据元素间的逻辑关系,对数据元素来说,除了存储其本身的信息外,还需存储一个指示其直接后继的信息(即直接后继的存储位置),由这两部分信息组成一个“节点”,表示线性表中一个数据元素。线性表的链式存储表示,有一个缺点就是要找到一个数,必须从“头”开始找。
节点结构
1.头插
头插:插入新节点。更新头指针
2.尾插
找到最尾节点,在其后链接新的节点
3.头删
删除头结点,更新头结点
4.尾删
找到最尾节点,删除,修改新的尾节点使其指向空
5.从尾到头打印单链表
借助栈实现
6.反转单链表
7. 删除一个无头单链表的非尾节点
8.查找节点
9.在无头单链表的一个节点前插入一个节点
10.排序
11.合并两个有序链表使合并后的链表依然有序(采用递归实现)
12.单链表实现约瑟夫环
时间复杂度较高的一种算法,使用环形单链表来模拟圆圈,实现
时间复杂度较低的算法考虑约瑟夫环的特性
13.查找单链表的中间节点,要求只能遍历一次链表
14.查找单链表的倒数第k个节点,要求只能遍历一次链表
15.两个链表的第一个公共节点(即判断两链表相交)
两个链表若相交,则从相交点起之后的节点都相同。开始的时候写了被注释处的代码,觉得重复的地方太多,就又改了。
完整代码和测试用例的地址