双向链表删除连续奇数块时出现段错误,求修复方法
修复双向链表连续奇数块删除的段错误问题
咱们先看看你代码里触发段错误的几个核心问题哈:
- 空指针非法访问:如果链表最后几个节点全是奇数,内层循环里
wp = wp->next后wp会变成nullptr,这时候再执行wp->prev = del_el->prev就会直接访问空指针,触发段错误。 - 双向链表指针调整不完整:你只更新了后继节点的
prev,但没处理前驱节点的next——比如删除中间的奇数块时,前面的偶数节点的next应该指向当前的wp;如果删除的是链表开头的奇数块,甚至需要更新头指针Start,这些你的代码都没做。 - 遍历指针跳跃错误:处理完奇数块后,wp已经指向了下一个偶数节点,外层循环又执行
wp = wp->next,会直接跳过这个偶数节点,导致后续逻辑混乱。
修复后的完整代码
void delete_odd_el(Tsnum *&Start) { Tsnum *wp = Start; while (wp != nullptr) { // 遇到奇数块的起始节点 if (wp->num % 2 == 1) { Tsnum *block_start = wp; // 记录当前奇数块的起始位置 // 先遍历找到奇数块的结束位置(直到遇到偶数或链表末尾) while (wp != nullptr && wp->num % 2 == 1) { wp = wp->next; } Tsnum *prev_node = block_start->prev; // 奇数块的前驱节点 // 调整前驱节点的next指针 if (prev_node != nullptr) { prev_node->next = wp; } else { // 前驱为空说明删除的是链表头部,更新头指针 Start = wp; } // 调整后继节点的prev指针(如果后继节点存在) if (wp != nullptr) { wp->prev = prev_node; } // 逐个删除奇数块内的所有节点 Tsnum *del_el = block_start; while (del_el != wp) { Tsnum *next_del = del_el->next; delete del_el; del_el = next_del; } } else { // 当前是偶数节点,直接移动到下一个节点继续遍历 wp = wp->next; } } }
修复思路拆解:
- 先定位再操作:先完整找到整个奇数块的范围(从
block_start到wp之前的节点),再统一调整前后指针,避免边删边调导致的空指针问题。 - 双向指针完整更新:同时处理前驱节点的
next和后继节点的prev,确保链表的双向链接始终有效;特殊处理头节点被删除的情况,及时更新Start。 - 合理的遍历逻辑:处理完奇数块后,wp已经指向了下一个需要处理的节点,只有遇到偶数节点时才手动移动wp,避免跳过节点。
- 安全删除节点:先保存每个要删除节点的下一个节点,再执行删除,防止删除后丢失指针无法继续遍历。
内容的提问来源于stack exchange,提问作者Alex Fr
相关产品推荐
相关产品推荐

