如何删除队列中所有大于指定值的元素?附现有实现代码
你当前代码存在的问题
- 类型拼写错误:删除节点时声明的
Nodo* aux与你定义的节点类型Node不匹配,会直接触发编译报错 - 未处理队首节点符合删除条件的场景:当前逻辑仅从队首的下一个节点开始判断,若队首节点值大于x会被遗漏
- 野指针访问风险:节点删除后你仍然将已释放的n2赋值给n1、并访问
n2->next,会触发内存访问异常
修复后的代码
void problem(Queue* c, int x) { if (isEmpty(c)) { printf("empty queue"); return; } // 先处理队首节点需要删除的情况 while (c->top != NULL && c->top->value > x) { Node* aux = c->top; c->top = c->top->next; free(aux); } // 队首全部删完后队列可能为空,提前终止 if (c->top == NULL) { return; } Node* n1 = c->top; Node* n2 = c->top->next; while (n2 != NULL) { if (n2->value > x) { Node* aux = n2; n1->next = aux->next; free(aux); // 删除后仅移动n2指针,n1保持当前位置 n2 = n1->next; } else { // 未命中删除规则时同时移动两个指针 n1 = n2; n2 = n2->next; } } }
补充说明
如果你的队列结构体中还维护了队尾指针,删除节点时如果判断到被删除的是队尾节点,需要同步将队尾指针更新为n1,避免后续入队操作出现异常。
内容的提问来源于stack exchange,提问作者Miguel Barra
相关产品推荐
相关产品推荐

