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

C++迭代法检查单链表是否有序 仅校验前两个节点问题求助

问题根因分析
  • 提前返回导致遍历中断:你在ordered()函数的while循环内,只要完成第一次相邻节点的比较,不管结果是否符合升序要求,都会直接return对应字符串,p = p->next这行代码永远不会被执行,自然只能校验前两个节点。
  • 存在空指针访问风险:当前循环终止条件为p != nullptr,当p指向链表最后一个节点时,p->next为nullptr,此时访问p->next->item会触发空指针异常,严重时会导致程序崩溃。
修复方案

首先明确校验逻辑:假设你要校验的是升序有序,则所有相邻节点都需满足前节点值 < 后节点值,只要出现任意一组不满足的情况,即可判定为无序;全部校验通过才能判定为有序。

修复后的ordered()函数参考实现如下:

std::string ordered() {
    // 空链表、仅一个节点的链表默认有序
    if (begin_ == nullptr || begin_->next == nullptr) {
        return "in order";
    }
    CustomListNode* p = begin_;
    // 只遍历到倒数第二个节点,避免访问最后一个节点的空next指针
    while (p->next != nullptr) {
        // 只要出现一组前节点大于等于后节点,直接判定无序
        if (p->item > p->next->item) {
            return "not in order";
        }
        p = p->next;
    }
    // 所有相邻节点都校验通过,判定有序
    return "in order";
}

补充优化提示

你现有代码中还有两处潜在崩溃问题,可同步优化:

  • pop_front()函数中先执行了begin_->next访问,再判断begin_是否为空,如果空链表调用该接口会直接崩溃,建议将空指针判断移到最前面。
  • pop_back()函数未处理链表长度≤2的场景,当链表只有1个节点时访问p->next->next会触发空指针异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:09:03