菜单

线性数据结构

相关源文件

本页面提供了线性数据结构的全面概述,它们是计算机科学中的重要组成部分,并且在技术面试中经常被考察。线性数据结构的特点是元素按顺序排列,每个元素都与其相邻元素连接。

有关树和图等非线性数据结构的信息,请参见树和图以及哈希表

线性数据结构概述

线性数据结构按顺序组织元素,允许元素一个接一个地遍历。此存储库中涵盖的主要线性数据结构包括

来源:README.md61-93

数组

数组是存储在连续内存位置的元素集合,允许通过索引进行随机访问。虽然此存储库没有专门的数组实现类,但许多问题都以数组为基础。

时间复杂度

操作时间复杂度
访问O(1)
搜索O(n)
插入O(n)
删除O(n)

数组支持通过索引进行常数时间访问,但插入和删除需要移动元素,最坏情况下的时间复杂度为O(n)。

链表

链表是一种由称为节点的元素组成的线性集合,其中每个节点通过指针指向下一个节点。与数组不同,链表允许高效的插入和删除操作。

链表的类型

此存储库涵盖三种类型的链表

  1. 单向链表:每个节点指向下一个节点,最后一个节点指向null
  2. 双向链表:每个节点有两个指针,一个指向前一个节点,一个指向后一个节点
  3. 循环链表:类似于单向链表,但最后一个节点指向第一个节点

时间复杂度

操作时间复杂度
访问O(n)
搜索O(n)
插入O(1)
删除O(1)

链表在插入和删除(假设您有指向位置的引用)方面表现出色,但访问和搜索操作需要遍历。

实现示例

此存储库包含多个链表实现和问题,例如

  • 反转链表
  • 删除链表中的节点
  • 检查链表是否为回文
  • 用链表表示的两个数字相加

来源:README.md62-73 LinkedList/README.md LinkedList/reverseLinkedList.java

栈是元素的集合,具有两个主要操作:push(添加元素)和pop(移除最近添加的元素)。栈遵循后进先出(LIFO)原则。

栈操作

时间复杂度

操作时间复杂度
访问O(n)
搜索O(n)
推送O(1)
弹栈(Pop)O(1)

实现示例:最小栈(MinStack)

一个常见的面试问题是实现一个支持在常数时间内查找最小元素的栈。此存储库包含最小栈(MinStack)的实现

MinStack 的实现使用链表结构,其中每个节点都存储其值以及到该点为止栈中的最小值。这使得包括查找最小值在内的所有栈方法都可以在 O(1) 时间内完成。

来源:README.md75-83 company/snapchat/MinStack.java15-55 company/uber/MinStack.java15-55 company/amazon/MinStack.java15-55 leetcode/design/MinStack.java15-55 company/google/MinStack.java15-55 company/bloomberg/MinStack.java15-55

队列

队列是元素的集合,支持两个主要操作:enqueue(添加元素)和dequeue(移除最早添加的元素)。队列遵循先进先出(FIFO)原则。

队列操作

时间复杂度

操作时间复杂度
访问O(n)
搜索O(n)
入队(Enqueue)O(1)
出队(Dequeue)O(1)

队列在按接收顺序处理任务以及实现广度优先搜索算法方面特别有用。

来源:README.md85-93 Queue/movingAverageFromDataStream.java

时间复杂度比较

下表总结了所有线性数据结构操作的时间复杂度

数据结构访问搜索插入删除
数组O(1)O(n)O(n)O(n)
链表O(n)O(n)O(1)O(1)
O(n)O(n)O(1)O(1)
队列O(n)O(n)O(1)O(1)

来源:README.md61-93

面试注意事项

准备面试时,请考虑线性数据结构的以下几个方面

  1. 数组与链表:理解数组(快速访问,慢速插入/删除)和链表(慢速访问,快速插入/删除)之间的权衡

  2. 栈的应用:

    • 表达式求值和语法解析
    • 回溯算法
    • 实现函数调用(调用栈)
  3. 队列的应用:

    • 广度优先搜索
    • 任务调度
    • 异步数据传输
  4. 常见问题:

    • 用队列实现栈,反之亦然
    • 使用栈验证括号平衡
    • 反转链表
    • 查找链表中的环
    • 实现特殊数据结构,例如最小栈(MinStack)或用栈实现队列
  5. 边界情况:始终考虑空结构、单元素结构以及结构开头/末尾的操作。

理解这些线性数据结构及其特性对于技术面试和实际编程任务至关重要。

来源:README.md61-93 company/snapchat/MinStack.java1-55 LinkedList/reverseLinkedList.java