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

自定义Deque插入元素后调用peakHead抛出空指针异常求助

问题分析:自定义Deque添加元素后调用peakHead()抛出NullPointerException

我仔细看了你的代码,问题的根源出在双向链表DLL类的addFirst和addLast方法参数顺序错误,导致元素根本没被正确插入到链表的有效区域里,所以peakHead()返回的是null,调用toString()自然就抛出NullPointerException了。

问题具体定位

先看你的DLL类里的addBetween方法定义:

private void addBetween(T ele,Node<T> before, Node<T> after) { 
    Node<T> newN = new Node<T>(ele,after,before); 
    before.setNext(newN); 
    after.setPrev(newN); 
    size++; 
}

这个方法的逻辑是:在before节点和after节点之间插入新节点,参数顺序是(元素, 前节点, 后节点)。

但你的addFirst方法完全搞反了参数顺序:

public void addFirst(T ele) { 
    addBetween(ele,header.getNext(),header); 
}

这里把header.getNext()(本该是后节点)当成了前节点参数,把header(本该是前节点)当成了后节点参数,导致新节点被插到了header的前面,header.getNext()依然指向初始化时的trailer哨兵节点——而trailer的element是null,所以first()方法返回的就是null。

同样,addLast方法也犯了同样的参数顺序错误:

public void addLast(T ele) { 
    addBetween(ele,trailer,trailer.getPrev()); 
}

这里把trailer(本该是后节点)当成了前节点,把trailer.getPrev()(本该是前节点)当成了后节点,新节点根本没被插入到有效元素区域。

修复方案

只需要修正DLL类中的addFirst和addLast方法的参数顺序即可:

修正后的addFirst:

public void addFirst(T ele) { 
    addBetween(ele, header, header.getNext()); 
}

修正后的addLast:

public void addLast(T ele) { 
    addBetween(ele, trailer.getPrev(), trailer); 
}

这样调用addFirst时,新节点会被正确插入到header(头哨兵)和它的下一个节点之间,first()方法就能获取到第一个有效元素;addLast则会把新节点插入到trailer的前一个节点和trailer之间,last()也能正常返回最后一个元素。修正后再调用days.peakHead().toString()就不会再抛出NullPointerException了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:15:37