调试链表中购物车总价排序检查函数及新手调试资源咨询
链表订单总价排序检查函数返回错误的修复方案及新手调试建议
问题分析
我来帮你梳理下问题~你写的isSorted()函数里有几个明显的逻辑漏洞,导致返回结果不符合预期:
- 空指针隐患:你用
run.next!!强制解包,当run是链表最后一个节点时,run.next是null,运行时会直接抛出空指针异常(编译器没报错是因为它没法预判运行时的null情况) - 逻辑完全颠倒:你的判断逻辑是「当前节点总价大于下一个时移动指针,然后设
sort为true」,但我们要检查的是是否存在逆序(当前>下一个),一旦存在就说明链表未排序 - 初始值与循环逻辑错误:
sort初始设为false,但循环里不管情况如何最后都把它设为true,这会导致不管链表是否有序,最终都返回true
修复后的代码
修改后的isSorted()函数逻辑更严谨,能正确判断排序状态:
fun isSorted(): Boolean { // 空链表或只有一个节点,默认是有序的 var current = first ?: return true // 遍历到倒数第二个节点就停止,避免访问null的next while (current.next != null) { val currentPrice = current.order.shoppingCart.totalprice val nextPrice = current.next!!.order.shoppingCart.totalprice // 发现逆序直接返回false,无需继续遍历 if (currentPrice > nextPrice) { return false } // 移动到下一个节点 current = current.next!! } // 遍历完所有节点都无逆序,返回true return true }
关键修改点说明
- 处理边界场景:空链表或只有一个节点时,直接返回
true(没有需要比较的元素,默认有序) - 循环条件改为
current.next != null,避免访问最后一个节点的nullnext - 一旦发现逆序立刻返回
false,减少不必要的遍历 - 只有遍历完所有节点都没发现逆序,才返回
true
新手调试技巧推荐
对于新手来说,调试这类问题可以试试这些实用方法:
- 打印关键日志:在循环里打印每个节点的
totalprice,比如println("当前节点总价:${current.order.shoppingCart.totalprice}"),直观看到每一步的数值变化,快速定位逻辑问题 - IDE断点调试:在IntelliJ IDEA或Android Studio里,点击代码行号左侧设置断点,启动调试模式后一步步执行代码,观察
current、current.next等变量的实时值,看是否符合预期 - 测试边界用例:单独验证几种典型场景:
- 空链表:调用
isSorted()应该返回true - 仅一个订单节点:返回
true - 按总价升序排列的链表:返回
true - 存在逆序的链表(比如第一个节点总价大于第二个):返回
false
- 空链表:调用
- 简化逻辑分步验证:先写只有两个节点的测试用例,验证函数能正确判断两个节点的顺序,没问题再扩展到多个节点的场景
内容的提问来源于stack exchange,提问作者user12595983
相关产品推荐
相关产品推荐

