You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

环形链表删除节点函数测试用例失败,请求排查代码问题

环形链表删除节点函数的逻辑错误排查与修复

原函数代码

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
    

逻辑错误分析

  1. 代码执行顺序彻底错误:处理完单节点逻辑后,直接执行删除头节点的代码块并return head,导致后面查找中间/尾部节点的代码完全无法执行。这就是为什么无论目标节点是什么,都会先删掉头节点。
  2. 删除头节点无判断逻辑:原代码没有检查头节点的data是否等于key,就直接删除头节点,完全不符合需求。
  3. 查找目标节点的循环条件错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:10:50