003 数据结构入门:八大数据结构核心详解,从此告别“无从下手”!

摘要

数据结构是算法的基石,掌握核心数据结构能显著提升代码效率和问题解决能力。本文将详解数组、链表、栈、队列、哈希表、集合等基础数据结构,从底层原理到应用场景,搭配LeetCode经典题目,助你快速构建数据结构知识体系!


目录

  1. 数组(Array)
  2. 链表(Linked List)
  3. 栈(Stack)
  4. 队列(Queue)
  5. 哈希表(Hash Table)
  6. 集合(Set)
  7. 数据结构对比与总结

1. 数组(Array)

核心特点

  • 内存连续:元素在内存中连续存储
  • 随机访问:通过下标直接访问元素,时间复杂度 O(1)
  • 固定大小:多数编程语言中数组长度不可变

️ 操作复杂度

操作 时间复杂度
访问元素 O(1)
插入/删除元素 O(n)(需移动后续元素)

应用场景

  • 频繁随机访问(如矩阵运算)
  • 数据有序且大小固定(如存储RGB颜色值)

LeetCode例题

  • 88. 合并两个有序数组
  • 53. 最大子数组和

2. 链表(Linked List)

2.1 单向链表

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
  • 内存不连续:节点通过指针链接
  • 插入/删除高效:时间复杂度 O(1)(已知前驱节点)
  • 访问低效:需从头遍历,时间复杂度 O(n)

2.2 双向链表

class DoublyListNode:
    def __init__(self, val=0, prev=None, next=None):
        self.val = val
        self.prev = prev
        self.next = next
  • 双指针:支持前向和后向遍历
  • 应用:实现LRU缓存(如LeetCode 146题)

2.3 循环链表

  • 尾节点指向头节点:适合环形数据结构(如轮询任务调度)

LeetCode例题

  • 206. 反转链表
  • 141. 环形链表

3. 栈(Stack)

核心特点

  • 后进先出(LIFO):最后入栈的元素最先出栈
  • 操作受限:仅允许在栈顶插入(push)和删除(pop)

️ 操作复杂度

操作 时间复杂度
入栈(push) O(1)
出栈(pop) O(1)

应用场景

  • 函数调用栈
  • 括号匹配(如LeetCode 20题)
  • 表达式求值(逆波兰表达式)

代码示例

stack = []
stack.append(1)  # 入栈
top = stack[-1]  # 查看栈顶
stack.pop()      # 出栈

4. 队列(Queue)

4.1 普通队列

from collections import deque
queue = deque()
queue.append(1)  # 入队
front = queue[0]  # 查看队首
queue.popleft()   # 出队
  • 先进先出(FIFO):队尾入队,队首出队

4.2 双端队列(Deque)

  • 两端均可操作:可用于滑动窗口问题
  • LeetCode例题:239. 滑动窗口最大值

4.3 优先队列(Priority Queue)

  • 元素带优先级:每次取出优先级最高的元素
  • 实现方式:堆(Heap)
  • Python示例
import heapq
heap = []
heapq.heappush(heap, 3)  # 插入元素
top = heap[0]            # 查看堆顶
heapq.heappop(heap)      # 弹出堆顶

5. 哈希表(Hash Table)

核心原理

  • 键值对存储:通过哈希函数将键映射到存储位置
  • 冲突解决:常用方法有链表法(如Python字典)和开放寻址法

️ 操作复杂度

操作 平均时间复杂度 最坏时间复杂度
插入 O(1) O(n)
删除 O(1) O(n)
查询 O(1) O(n)

应用场景

  • 快速查找(如统计词频)
  • 去重(如LeetCode 1题两数之和)

Python字典示例

hash_map = {}
hash_map["key"] = "value"  # 插入
val = hash_map.get("key", default=None)  # 查询

6. 集合(Set)

核心特点

  • 元素唯一:自动去重
  • 无序存储:元素无特定顺序

️ 操作复杂度

操作 平均时间复杂度
添加元素 O(1)
删除元素 O(1)
查询元素 O(1)

应用场景

  • 去重(如统计唯一IP地址)
  • 集合运算(交集、并集、差集)

Python集合示例

s = set()
s.add(1)       # 添加元素
s.discard(1)   # 删除元素
if 1 in s:     # 查询元素
    print("存在")

7. 数据结构对比与总结

数据结构 优点 缺点 典型应用
数组 随机访问快 插入/删除慢,大小固定 矩阵运算、有序数据存储
链表 插入/删除快 随机访问慢 实现队列、LRU缓存
后进先出逻辑清晰 功能受限 函数调用、括号匹配
队列 先进先出符合公平性 普通队列出队效率低 任务调度、BFS算法
哈希表 查找极快 内存占用大,无序 缓存、词频统计
集合 去重和查询高效 无法存储键值对 唯一性校验、集合运算

总结

  1. 数组和链表是构建其他数据结构的基础,理解它们的差异是核心。
  2. 栈和队列是操作受限的线性表,分别对应LIFO和FIFO逻辑。
  3. 哈希表和集合依赖哈希函数,以空间换时间,适合高效查找。
  4. 实际开发中:优先选择语言内置实现(如Python的listdict),再考虑自定义结构。

互动

你在学习数据结构时遇到过哪些难题?欢迎留言讨论!
如果觉得本文对你有帮助,点赞⭐收藏关注,支持更多干货输出!

相关LeetCode练习推荐

  • 706. 设计哈希映射
  • 155. 最小栈
  • 622. 设计循环队列

你可能感兴趣的:(数据结构与算法,数据结构)