基于链表实现Queue时:enqueue操作为何不会覆盖原有节点?
队列enqueue方法逻辑疑问解答
不会出现之前存储的节点被新节点覆盖的情况,这段逻辑是单向链表实现队列的标准入队操作,具体原理如下:
逻辑拆解
当触发else分支时,队列已经存在至少1个节点,this.last当前指向队列的最后一个已有节点:
- 执行
this.last.next = node:给当前最后一个节点的next属性赋值为新节点,相当于把新节点挂接到原有链表的尾部,这一步操作只会给原有尾节点新增后继节点关联,不会修改任何已有节点的内容 - 执行
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 → Cthis.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
相关产品推荐
相关产品推荐

