环形数组

循环数组 CycleArray 总结(也称环形数组)

用固定长度数组 + 两个指针实现头尾 O(1) 增删。

核心变量

下标:     0     1     2     3     4
arr:    [ 2  |  3  |  5  |  _  |  _  ]
          ↑                   ↑
        start=0             end=3
        第1个元素           第4个格子(空)
变量含义
start第一个元素下标,闭区间(包含)
end最后一个元素的下一个位置,开区间(不包含)
count当前元素个数
size数组容量

有效元素在环上连续存储,不会出现 [2, _, 3, _, 5] 这种中间空洞。


口诀

先对准要操作的位置,操作完再更新指针。

指针指向添加删除
start 闭第一个元素先移再写先清再移
end 开下一个空位先写再移先移再清
  • 指针已在操作位置 → 先操作再移(删头、尾插)
  • 指针不在操作位置 → 先移再操作(头插写到 start 前、删尾删 end 前一位)

代码

# 头插 — 先移再写
self.start = (self.start - 1 + self.size) % self.size
self.arr[self.start] = val

# 删头 — 先清再移
self.arr[self.start] = None
self.start = (self.start + 1) % self.size

# 尾插 — 先写再移
self.arr[self.end] = val
self.end = (self.end + 1) % self.size

# 删尾 — 先移再清
self.end = (self.end - 1 + self.size) % self.size
self.arr[self.end] = None