C++单链表删除能被9整除节点问题:连续符合条件节点仅删除一个
问题原因及修复方案
核心问题
- 连续节点漏删:原代码删除一个符合条件的节点后,立刻把
currentNode移到下一个节点,导致新的currentNode->nextNodeAddress(也就是原本的下下个节点)没机会被检查。比如连续两个能被9整除的节点,删完第一个后,指针直接跳走,第二个就被漏掉了。 - 头节点没处理:原代码只检查当前节点的下一个节点,如果头节点本身的数据能被9整除,根本不会被删除。
修复后的代码
void deletebydivisable() { // 先处理头节点本身需要删除的情况 while (head != nullptr && head->data % 9 == 0) { Node* toDelete = head; head = head->nextNodeAddress; delete toDelete; } if (head == nullptr) { return; // 链表删空了,直接返回 } Node* currentNode = head; while (currentNode->nextNodeAddress != nullptr) { if (currentNode->nextNodeAddress->data % 9 == 0) { Node* toDelete = currentNode->nextNodeAddress; currentNode->nextNodeAddress = toDelete->nextNodeAddress; delete toDelete; // 删完不移动指针,继续检查新的下一个节点 } else { // 只有下一个节点不用删时,才移动指针 currentNode = currentNode->nextNodeAddress; } } }
关键改动说明
- 单独处理头节点:循环判断头节点是否符合删除条件,直到头节点没问题或者链表为空。
- 调整指针移动逻辑:删除节点后不立刻移动
currentNode,只有当下一个节点不需要删除时才移动,这样就能连续检查后续的节点。 - 优化循环条件:用
currentNode->nextNodeAddress != nullptr作为循环条件,避免访问空指针导致崩溃。
内容的提问来源于stack exchange,提问作者Laptop Account
相关产品推荐
相关产品推荐

