循环双链表删除节点的removeAt函数未通过测试,遗漏了哪些条件?
循环双链表按位置删除函数问题修复
存在的问题
- 不必要的内存分配导致内存泄漏:开头声明
temp和x指针时调用的malloc完全多余,后续代码直接覆盖了这两个指针的指向,申请的内存再也无法释放,且申请时的大小参数错误,应该是sizeof(struct Node)而非指针大小。 - 缺少入参合法性校验:没有判断
pos是否小于1、或者大于链表总长度,非法pos会直接导致空指针访问、野指针等崩溃问题。 - 尾节点删除后未更新全局
tail指针:当删除的节点是尾节点时,只修改了前驱节点的next指向头节点,没有将tail更新为前驱节点,导致tail指向已被释放的内存,后续操作会出错。 - 循环逻辑存在越界风险:如果传入的
pos超过链表实际长度,循环会遍历到空指针后继续访问next成员,直接触发崩溃。
修复后的代码
void removeAt (int pos) { // 非法位置或者空链表直接返回,可按需求调整错误处理逻辑 if (pos < 1 || head == NULL) { return; } struct Node *temp = NULL; struct Node *x = NULL; if(pos == 1) { temp = head; if(head == tail) { head = tail = NULL; } else { head = head->next; head->prev = tail; tail->next = head; } free(temp); return; } // 遍历找第pos个节点,适配pos>=2的情况 temp = head; for(int i = 1; i < pos; i++) { x = temp; temp = temp->next; // 循环链表回到头节点说明pos超过链表长度,直接返回 if (temp == head) { return; } } x->next = temp->next; if(temp == tail) { tail = x; // 删除尾节点必须更新tail指针 x->next = head; } else { temp->next->prev = x; } free(temp); }
验证测试场景
可优先测试以下场景确认修复效果:
- 删除非头尾的中间节点
- 删除尾节点后再次执行新增/删除操作
- 传入大于链表长度的pos值
- 链表只剩1个节点时执行删除
内容的提问来源于stack exchange,提问作者YouSuggestMe
相关产品推荐
相关产品推荐

