什么是链表?
链表是一种物理上非连续的逻辑存储结构,每个节点有指针域和数据域,指针域存储该节点逻辑上的下一个节点,数据域存储该节点的数据。
给定单链表的头指针,如何判断是否有环?
- 方法一:从头遍历,将每个遍历的节点存储到一个集合中,
- 方法二:使用两个指针从头开始遍历,在一个循环中移动两个指针,指针1每次移动一步,指针2每次移动两步,每次比较两个指针指向的节点是否相同,如果指针2无法再向前移动,说明达到最后一个元素,链 表没有环。否则,一定会出现指针2和指针1相遇的情况,如果出现两个指针指向节点相同,说明链表中存在环。
- 时间复杂度O(n)
如何判断两条单链表是否有交叉?
- 用两个指针交替遍历两条链表,每次遍历都存储各自遍历的节点,并判断当前节点是否在两个指针遍历的节点的集合中,如果出现一个指针遍历的节点在另一个指针对应集合中,则判断出现交叉,交叉点就是当前节点
- 时间辅助度O(m+n),空间复杂度:O(m+n)
单链表有什么优缺点
- 优点:链表长度可变,内存可以不连续从而利用率高,删除和插入效率高
- 缺点:无法随机查找,凡是涉及查找的操作复杂度都是O(n)
链表和数组的对比
- 数组长度固定,链表长度可变
- 数组内存是连续的,链表物理内存可以不连续
- 数组随机访问元素效率高,链表随机访问效率低,必须从头遍历
- 数组删除、插入元素效率低,链表删除、插入元素效率高
链表随机删除一个给定元素复杂度是多少?
给定元素和给定序号,不同。
- 单链表:O(n),查找O(n),修改指针O(1)
- 双链表:O(1)
链表删除一个给定序号的元素复杂度是多少?
给定序号,无论是单链表还是双链表,都需要从头遍历找到对应序号的元素。