单链表void decimate()方法删除每第10个节点无效问题排查
解决链表
decimate()方法无变化的问题 嘿,我来帮你捋捋为啥你的decimate()方法调用后链表没变化——你的代码目前只写了个开头,遗漏了好几个关键的核心逻辑,我给你拆解一下:
- 没遍历整个链表:你只写了一轮10次的for循环,但要删除每第10个节点,得持续遍历整个链表直到末尾,而不是只走10步就停下。
- 缺少前节点维护:删除链表节点不能只操作当前节点,必须让它的前一个节点的
next指向它的下一个节点,不然链表会直接断开。如果要删除的是头节点,还得单独更新head指针。 - 计数器逻辑错误:
- 你从0开始计数,但通常我们会从1开始数,这样数到10时刚好对应目标节点;
- 删除节点后没重置/调整计数器——删除节点后,后续节点的位置往前挪了一位,下一轮计数得重新从1开始算。
- 没有实际的删除逻辑:找到第10个节点后,你没写任何删除操作,比如调整指针指向、释放节点内存(如果是C/C++这类手动管理内存的语言),等于根本没改动链表结构。
- 未处理边界情况:比如链表为空、节点总数不足10个,或者要删除的是尾节点(如果你的链表有
tail指针的话),这些情况都得提前判断。
给你一个完整的示例代码(假设是C++单链表,有head指针),你可以参考下:
void decimate() { if (head == nullptr) return; // 空链表直接返回 Node* prev = nullptr; Node* temp = head; int count = 1; // 从1开始计数,方便定位第10个节点 while (temp != nullptr) { if (count == 10) { // 处理删除逻辑 if (prev == nullptr) { // 要删除的是头节点,更新head head = temp->next; } else { // 让前节点跳过当前节点 prev->next = temp->next; } // 释放要删除的节点内存 Node* toDelete = temp; temp = temp->next; // 先移动指针再删除,避免悬空 delete toDelete; count = 1; // 重置计数器,重新开始数 } else { // 没到第10个,继续遍历 prev = temp; temp = temp->next; count++; } } }
内容的提问来源于stack exchange,提问作者Josh Garza
相关产品推荐
相关产品推荐

