面试题-链表

什么是链表?

链表是一种物理上非连续的逻辑存储结构,每个节点有指针域和数据域,指针域存储该节点逻辑上的下一个节点,数据域存储该节点的数据。

给定单链表的头指针,如何判断是否有环?

  • 方法一:从头遍历,将每个遍历的节点存储到一个集合中,
  • 方法二:使用两个指针从头开始遍历,在一个循环中移动两个指针,指针1每次移动一步,指针2每次移动两步,每次比较两个指针指向的节点是否相同,如果指针2无法再向前移动,说明达到最后一个元素,链 表没有环。否则,一定会出现指针2和指针1相遇的情况,如果出现两个指针指向节点相同,说明链表中存在环。
  • 时间复杂度O(n)

如何判断两条单链表是否有交叉?

  • 用两个指针交替遍历两条链表,每次遍历都存储各自遍历的节点,并判断当前节点是否在两个指针遍历的节点的集合中,如果出现一个指针遍历的节点在另一个指针对应集合中,则判断出现交叉,交叉点就是当前节点
  • 时间辅助度O(m+n),空间复杂度:O(m+n)

单链表有什么优缺点

  • 优点:链表长度可变,内存可以不连续从而利用率高,删除和插入效率高
  • 缺点:无法随机查找,凡是涉及查找的操作复杂度都是O(n)

链表和数组的对比

  • 数组长度固定,链表长度可变
  • 数组内存是连续的,链表物理内存可以不连续
  • 数组随机访问元素效率高,链表随机访问效率低,必须从头遍历
  • 数组删除、插入元素效率低,链表删除、插入元素效率高

链表随机删除一个给定元素复杂度是多少?

给定元素和给定序号,不同。

  • 单链表:O(n),查找O(n),修改指针O(1)
  • 双链表:O(1)

链表删除一个给定序号的元素复杂度是多少?

给定序号,无论是单链表还是双链表,都需要从头遍历找到对应序号的元素。

猜你喜欢

转载自blog.csdn.net/ten_sory/article/details/108470952