本页面提供了线性数据结构的全面概述,它们是计算机科学中的重要组成部分,并且在技术面试中经常被考察。线性数据结构的特点是元素按顺序排列,每个元素都与其相邻元素连接。
线性数据结构按顺序组织元素,允许元素一个接一个地遍历。此存储库中涵盖的主要线性数据结构包括
数组是存储在连续内存位置的元素集合,允许通过索引进行随机访问。虽然此存储库没有专门的数组实现类,但许多问题都以数组为基础。
| 操作 | 时间复杂度 |
|---|---|
| 访问 | O(1) |
| 搜索 | O(n) |
| 插入 | O(n) |
| 删除 | O(n) |
数组支持通过索引进行常数时间访问,但插入和删除需要移动元素,最坏情况下的时间复杂度为O(n)。
链表是一种由称为节点的元素组成的线性集合,其中每个节点通过指针指向下一个节点。与数组不同,链表允许高效的插入和删除操作。
此存储库涵盖三种类型的链表
| 操作 | 时间复杂度 |
|---|---|
| 访问 | 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 的实现使用链表结构,其中每个节点都存储其值以及到该点为止栈中的最小值。这使得包括查找最小值在内的所有栈方法都可以在 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 company/snapchat/MinStack.java1-55 LinkedList/reverseLinkedList.java