You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于链表实现Queue时:enqueue操作为何不会覆盖原有节点?

队列enqueue方法逻辑疑问解答

不会出现之前存储的节点被新节点覆盖的情况,这段逻辑是单向链表实现队列的标准入队操作,具体原理如下:

逻辑拆解

当触发else分支时,队列已经存在至少1个节点,this.last当前指向队列的最后一个已有节点:

  1. 执行this.last.next = node:给当前最后一个节点的next属性赋值为新节点,相当于把新节点挂接到原有链表的尾部,这一步操作只会给原有尾节点新增后继节点关联,不会修改任何已有节点的内容
  2. 执行this.last = node:仅更新队列自身的尾指针指向,把原本指向旧尾节点的this.last引用,修改为指向新的尾节点,这一步只是修改指针本身的指向,完全不会改动之前的节点数据

示例验证

假设队列已经入队了2个元素,此时链表结构为 节点A(值1) → 节点B(值2),this.first指向A,this.last指向B:

  • 执行enqueue(3)生成新节点C(值3)
  • this.last.next = node 执行后,B的next属性指向C,链表变为 A → B → C
  • this.last = node 执行后,this.last指向C,队列尾标记更新完成
  • 此时遍历队列从first开始的链表,仍然能完整拿到A、B、C三个节点,没有任何数据被覆盖

你可以运行下方测试代码验证效果:

const q = new Queue()
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
console.log(q.first.value) // 输出1
console.log(q.first.next.value) // 输出2
console.log(q.first.next.next.value) // 输出3
console.log(q.last.value) // 输出3

可能遗漏的知识点

  • 单向链表的存储特性:每个节点都是独立的对象实例,通过next指针串联成链,修改尾节点的指针只会新增关联,不会影响上游节点
  • JS引用类型的赋值逻辑:this.first、this.last都只是指向节点对象的引用,修改引用的指向,不会改变它之前指向的对象本身的内容
  • 队列O(1)复杂度的入队实现要求:仅通过修改尾指针和旧尾节点的next属性完成入队,不需要遍历整个链表,性能最优

内容的提问来源于stack exchange,提问作者mozart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:57:03