Java实现链表deleteFromFront方法返回值错误该如何修复?
问题说明
我正在完成数据结构课程的项目,要求编写类实现存储int类型值的链表,具体要求如下:
- 使用内部类实现Node节点
- 包含要求的所有方法
- 编写测试程序,支持按任意顺序使用任意数据测试所有方法
我需要实现public int deleteFromFront()方法,功能为删除链表头部节点,返回被删除节点存储的int值,链表为空时返回null。目前我编写的方法可以成功删除头节点,但返回值存在错误:例如链表为4 3 10 11 3 15 6 11 18 17 时,删除头节点应返回4,但我的方法返回了新头节点的值3。
错误原因
你的deleteFromFront方法逻辑顺序存在问题:
你先修改了head的指向,让它指向了新的头节点,之后才取head的value返回,自然拿到的是删除后的新头节点的值,不是被删除的旧头节点的值。
同时还存在两个隐藏bug:
- int是基本数据类型,无法返回null,你当前代码空链表返回-1,如果要严格符合返回null的要求,需要把返回值类型改为包装类Integer;
- 当链表只有一个节点时,你会把head设为null,最后执行
return head.value会直接抛出空指针异常。
修复方案
符合返回null要求的版本
public Integer deleteFromFront() { if (head == null) // 空链表返回null return null; // 先保存待删除的旧头节点的值 int deletedValue = head.value; if (head == tail) { head = null; tail = null; } else { head = head.nextNode; } // 返回预先保存的旧头节点值 return deletedValue; }
约定空链表返回-1的int版本
如果可以接受空链表返回-1作为特殊标识,不需要返回null,可以用以下版本:
public int deleteFromFront() { if (head == null) return -1; int deletedValue = head.value; if (head == tail) { head = null; tail = null; } else { head = head.nextNode; } return deletedValue; }
内容的提问来源于stack exchange,提问作者user16854661
相关产品推荐
相关产品推荐

