环形链表删除节点函数测试用例失败,请求排查代码问题
环形链表删除节点函数的逻辑错误排查与修复
原函数代码
Node* deleteNode(Node* head, int key) { if(head == NULL){ return NULL; } //if their is only one node in list if(head -> data == key && head -> next == head){ delete(head); head = NULL; return NULL; } // if first node is to be deleted Node* last = head; Node* temp = head; while(last -> next != temp){ last = last -> next; } last -> next = temp -> next; delete(temp); head = last -> next; return head; while(last -> next != head || last -> next -> data != key){ last = last -> next; } Node* dum = last -> next; last -> next = dum -> next; delete(dum); return head; }
失败测试用例
测试用例1
- 输入:
1 2 3 4 5 -1 3 - 实际输出:
2 3 4 5 -1 - 期望输出:
1 2 4 5 -1
测试用例2
- 输入:
1 2 3 4 5 -1 6 - 实际输出:
2 3 4 5 -1 - 期望输出:
1 2 3 4 5 -1
逻辑错误分析
- 代码执行顺序彻底错误:处理完单节点逻辑后,直接执行删除头节点的代码块并
return head,导致后面查找中间/尾部节点的代码完全无法执行。这就是为什么无论目标节点是什么,都会先删掉头节点。 - 删除头节点无判断逻辑:原代码没有检查头节点的
data是否等于key,就直接删除头节点,完全不符合需求。 - 查找目标节点的循环条件错误:
while(last -> next != head || last -> next -> data != key)用了||逻辑,会导致循环无法正确终止;同时没有处理“链表中不存在目标节点”的情况,即使找不到也会执行删除操作。
修复后的代码
Node* deleteNode(Node* head, int key) { if (head == NULL) { return NULL; } // 处理单节点链表的情况 if (head->data == key && head->next == head) { delete head; return NULL; } Node* last = head; // 先找到链表的尾节点(指向head的节点) while (last->next != head) { last = last->next; } // 情况1:要删除的是头节点 if (head->data == key) { last->next = head->next; delete head; head = last->next; return head; } // 情况2:查找并删除中间或尾部的目标节点 Node* curr = head; while (curr->next != head && curr->next->data != key) { curr = curr->next; } // 如果找到目标节点才执行删除 if (curr->next != head && curr->next->data == key) { Node* temp = curr->next; curr->next = temp->next; delete temp; } // 没找到目标节点,直接返回原链表 return head; }
修复说明
- 调整代码执行顺序:先找尾节点,再判断是否删除头节点,最后处理中间/尾部节点的删除逻辑。
- 增加目标节点存在性判断:找不到目标节点时直接返回原链表,避免错误删除。
- 修正循环条件:用
&&确保正确遍历查找目标节点,不会陷入死循环。
内容的提问来源于stack exchange,提问作者sunny badsra
相关产品推荐
相关产品推荐

