Java链表实现在现有节点间插入新节点的异常问题求助
问题原因分析
- 插入节点的执行顺序错误:你现有代码中先执行
curr.setNext(newNode)修改当前节点的后继指针,再执行newNode.setNext(curr.getNext()),此时curr.getNext()已经被改写为新节点的地址,最终新节点的后继指针指向自身,原后续的8、9节点失去引用被回收,这是节点丢失的直接原因。 - 容量校验逻辑位置错误:你在插入操作完成后才判断链表是否超过最大容量,此时插入行为已经执行完毕,异常抛出无法起到拦截作用,应该将容量校验放在插入逻辑最前面。
- 缺少索引合法性校验,且插入完成后没有更新链表的
size计数,会导致后续的容量判断和索引定位出错。 - 结合你给出的预期结果,插入7后不需要保留原后续的8、9节点,直接将新节点的后继指针设为
null即可。
修改后代码
@Override public void insert(int index, E data) throws ListOverflowException { // 先做容量校验 if (size == maxSize) { throw new ListOverflowException("Error! Can't add any more nodes"); } // 索引合法性校验 if (index < 0 || index > size) { throw new IndexOutOfBoundsException("Invalid insert index"); } Node<E> curr = startOfNode; int ctr = 0; // 定位到要插入位置的前驱节点 for (curr = startOfNode; curr !=null; curr = curr.getNext()) { if (ctr == index) { Node<E> newNode = new Node<>(data); // 按预期结果要求截断后续节点,直接将新节点后继设为null newNode.setNext(null); curr.setNext(newNode); // 插入完成后更新size size++; break; } ctr++; } }
如果你需要保留原后续的8、9节点,只需要将
newNode.setNext(null)改为newNode.setNext(curr.getNext()),并且将这行代码放在curr.setNext(newNode)之前执行即可。
内容的提问来源于stack exchange,提问作者user15082428
相关产品推荐
相关产品推荐

