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
相关产品推荐
相关产品推荐

