如何修改队列头部插入代码,使新元素添加至已插入头部元素之后?
看起来你想实现的是——往队列头部添加元素时,新元素不是直接插到最前面,而是排在之前插入的头部元素的后面,对吧?比如第一次插X,队列变成[X, 原队列];第二次插Y,队列变成[X, Y, 原队列],而不是[Y, X, 原队列]。
你原来的代码每次都把新节点设为新的head,所以新元素永远抢占最前面的位置,这就是问题所在。要解决这个,我们需要跟踪最后一个插入到头部的元素,这样每次新元素都能接在它后面。
修改步骤:
给Queue类添加一个成员变量
我们需要一个指针来记录头部插入链的最后一个节点,比如叫frontChainTail。在类定义里添加它,并在构造函数中初始化为NULL:class Queue { private: Node* head; Node* frontChainTail; // 新增:跟踪头部插入链的末尾 // 其他私有成员... public: Queue() : head(NULL), frontChainTail(NULL) {} // 初始化两个指针 // 其他成员函数... void addtoFront(string first, string last); };修改
addtoFront函数
根据是否是第一次插入头部元素,分两种情况处理:void Queue::addtoFront(string first, string last){ Node *temp = new Node(first, last, NULL); if (frontChainTail == NULL) { // 第一次插入头部元素:把新节点连到原队列头部,更新head temp->next = head; head = temp; // 记录这个节点为头部链的末尾,下次插在它后面 frontChainTail = temp; } else { // 非第一次插入:把新节点接在头部链的末尾,同时让新节点连到原队列的起始位置 temp->next = frontChainTail->next; frontChainTail->next = temp; // 更新头部链的末尾为新节点 frontChainTail = temp; } }
效果说明:
- 假设原队列是
[A, B, C](head指向A) - 第一次调用
addtoFront("X", "X"):队列变成[X, A, B, C],frontChainTail指向X - 第二次调用
addtoFront("Y", "Y"):队列变成[X, Y, A, B, C],frontChainTail指向Y - 第三次调用
addtoFront("Z", "Z"):队列变成[X, Y, Z, A, B, C],完全符合你的需求!
如果队列为空的情况也能正常处理:第一次插入后队列是[X],第二次插入变成[X, Y],以此类推。
内容的提问来源于stack exchange,提问作者Angad
相关产品推荐
相关产品推荐

