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

如何在C++中仅用尾指针删除循环单链表的尾节点?求代码修正

修正循环单链表的deleteEnd()函数(仅使用尾指针)

错误原因分析

你的deleteEnd()函数存在两个核心问题:

  1. 循环逻辑错误:原代码的循环条件while (temp1->next != last)会让遍历停在倒数第二个节点(比如示例中的4),最终删除的是这个节点而非尾节点(3)。
  2. 参数传递问题:函数参数为struct node* last是传值调用,修改last的指向(比如单节点时设为NULL)无法同步到外部的尾指针,同时删除尾节点后也没有更新尾指针指向新的尾节点。

修正后的代码

struct node
{
    int data;            
    struct node* next;  
};

void deleteEnd(struct node** last)
{
    // 空链表直接返回
    if (*last == NULL)
        return;

    // 链表只有一个节点的情况
    if ((*last)->next == *last)
    {
        delete *last;
        *last = NULL;
        return;
    }

    // 找到尾节点的前一个节点
    struct node* temp = *last;
    while (temp->next != *last)
    {
        temp = temp->next;
    }

    // 跳过原尾节点,重新指向头节点
    temp->next = (*last)->next;
    // 删除原尾节点
    delete *last;
    // 更新尾指针为新的尾节点
    *last = temp;
}

关键修正点说明

  • 参数改为指针的指针:struct node** last可以让函数直接修改外部的尾指针指向,解决传值调用的问题。
  • 正确定位前序节点:通过while (temp->next != *last)找到原尾节点的前一个节点(示例中的4),确保要删除的是尾节点(3)。
  • 更新尾指针:删除原尾节点后,将尾指针指向新的尾节点(原尾节点的前一个节点),保证循环链表的结构正确。

测试示例验证

原链表:6->5->4->3->(循环)(尾指针last指向3)
执行修正后的deleteEnd()后:

  1. 找到前序节点4
  2. 4的next指向3的next(即6)
  3. 删除节点3
  4. 尾指针更新为4
    最终链表变为6->5->4->(循环),符合预期。

内容的提问来源于stack exchange,提问作者geta_l

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:31:18