线性结构中的元素具有前后次序,但实现方式不同。数组连续存储,可通过地址偏移 O(1) 访问下标,缓存局部性好;中间插删通常要移动元素,为 O(n)。动态数组容量不足时申请更大空间并复制,追加因此是摊还 O(1)

链表把节点分散存放并用指针连接。已知插入位置的前驱时,插删可为 O(1),但查找第 i 个元素需顺序走 O(n)。双向链表多一个前驱指针,便于从节点本身删除和双向遍历,代价是更多空间与连接维护。

栈限制在同一端压入弹出,体现后进先出,适合函数调用、括号匹配、撤销和 DFS。队列从尾部加入、头部移除,体现先进先出,适合任务缓冲与 BFS。循环队列用固定数组和首尾索引复用空间,需要明确“空”和“满”的区分规则;双端队列允许两端操作,可实现滑动窗口。

这些结构的端点操作通常 O(1),但基于数组的队列若每次删除首元素都整体搬移,就会退化;实践中应使用环形索引。链式实现无需整体扩容,却有节点对象和指针开销。

误区是说链表插入永远 O(1) 而忽略定位成本、用普通数组首删模拟队列、混淆栈顶和队尾,以及忽略迭代时修改结构的规则。小结:数组优化定位与局部性,链表优化已知位置连接,栈和队列则通过访问约束表达处理顺序。