C++链表删除偶数节点代码求助:逻辑错误排查
问题分析与修复
先拆解你代码里的几个致命问题:
- 变量名拼写错误:定义的是
nod *curent;,但后续赋值用了current = head;,变量名不一致直接导致编译失败。 - 野指针风险:
aux未初始化就直接用于指针赋值,会破坏链表结构甚至引发程序崩溃。 - 空指针访问漏洞:当链表只有一个节点时,
curent->next为NULL,此时访问curent->next->info会触发空指针异常。 - 逻辑完全偏离目标:你的需求是删除第二个偶数节点,但代码里的指针跳转和赋值逻辑完全错误,根本没实现“将第一个节点与第三个节点相连”的操作。
针对需求的修正代码
如果你的目标是检查第二个节点是否为偶数,若是则删除它,正确实现如下:
void delete_even() { if (head == NULL) { cout << "List doesn't exist!"; return; } // 先判断是否存在第二个节点 if (head->next == NULL) { cout << "No second node to check!"; return; } nod *aux = head->next; // 保存要删除的第二个节点 if (aux->info % 2 == 0) { head->next = aux->next; // 第一个节点直接连到第三个节点 delete aux; // 释放内存 cout << "Second even node deleted!"; } else { cout << "Second node is not even!"; } }
如果你的需求是遍历整个链表,删除所有值为偶数的后继节点,修正后的遍历版本如下:
void delete_even() { if (head == NULL) { cout << "List doesn't exist!"; return; } nod *current = head; while (current != NULL && current->next != NULL) { if (current->next->info % 2 == 0) { nod *aux = current->next; // 暂存要删除的节点 current->next = aux->next; // 跳过要删除的节点 delete aux; // 释放内存 // 若只需删除第一个符合条件的节点,取消下面的注释 // break; } else { current = current->next; // 继续遍历下一个节点 } } }
核心逻辑说明
删除链表节点的标准步骤:
- 暂存要删除的节点,避免指针丢失;
- 让前一个节点的
next指向要删除节点的next,完成链表链路跳转; - 释放暂存节点的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Klau
相关产品推荐
相关产品推荐

