Python Queue类入队方法疑问:为何设置tail的next为新节点?
关于队列Enqueue方法的代码疑问解答
首先得明确用链表实现队列的核心逻辑:队列是**先进先出(FIFO)**的结构,链表节点的next指针方向是从队列头部(head)指向尾部(tail),每个节点的next都指向它后面更靠近队尾的节点。
你疑惑的这两行代码,其实是在正确地把新节点追加到队尾:
self.tail.set_next_node(item_to_add) self.tail = item_to_add
咱们拆解来看:
- 第一行
self.tail.set_next_node(item_to_add):当前的tail是队列的最后一个节点,让它的next指针指向新节点,相当于把新节点“接”在原来队尾的后面,让整个链表保持连续延长。 - 第二行
self.tail = item_to_add:更新tail指针,让它指向刚加入的新节点,确保下次执行enqueue时,能准确找到最新的队尾位置。
如果按你原来的思路——让新节点的next指向当前tail,逻辑会完全混乱:
假设当前队列是A -> B(head是A,tail是B),现在要加节点C。如果执行C.set_next_node(B),那C的next指向B,此时链表变成A->B和C->B两个脱节的部分,而且tail更新为C后,下次加节点D时,会让C的next指向D,最终队列的结构完全断裂,出队时根本找不到C这个节点(因为head还是A,A的next是B,和C没有关联)。
举个实际流程例子:
- 初始队列只有节点X,
head和tail都指向X。 - 调用
enqueue(Y):- 先让X的
next指向Y,链表变成X->Y。 - 再把
tail改成Y,现在tail指向队列的新末尾。
- 先让X的
- 再调用
enqueue(Z):- 让Y的
next指向Z,链表变成X->Y->Z。 - 更新
tail为Z,完成追加。
- 让Y的
这样整个队列的链表结构始终连续,完全符合FIFO的要求,出队时从head开始依次移除即可。
内容的提问来源于stack exchange,提问作者shanehowe
相关产品推荐
相关产品推荐

