为什么我自定义实现的链表的get方法会抛出NullPointerException?
问题原因
addAtTail方法实现错误是触发空指针异常的根本原因:
- 原
addAtTail的逻辑是遍历到局部变量curr == null时停止,直接给局部变量curr赋值新节点,这个操作完全没有修改链表本身的节点引用关系,新节点根本没有被接入链表,同时size还被错误加1,导致后续所有涉及size校验的逻辑都出现判断偏差。
我们走你给出的操作序列可以复现完整报错路径:
- 执行
MyLinkedList():head为null,size=0 - 执行
addAtHead(1):head指向值为1的节点,size=1,正常 - 执行
addAtTail(3):遍历链表时curr走到null后,给局部变量curr赋值新节点,链表本身完全没有变化,还是只有值为1的节点,但size被错误加为2 - 执行
addAtIndex(1,2):此时size是2,index=1符合校验条件,进入遍历环节循环1次后,将值为2的节点接在值为1的节点之后,size加为3。此时链表实际结构为1→2→null,但size被标记为3 - 执行
get(1):index=1 < size=3,校验通过,循环1次后curr走到值为2的节点,返回2,暂未触发异常 - 执行
deleteAtIndex(1):删除下标1的节点,链表变为1→null,size减为2 - 执行
get(1):index=1 < size=2,校验通过,循环执行1次后curr = curr.next得到null,此时访问curr.val直接触发NullPointerException
修复方案
首先修复addAtTail方法:
void addAtTail(int val) { // 将值为val的节点追加到链表末尾 Node newNode = new Node(val); // 先处理链表为空的情况 if (this.head == null) { this.head = newNode; size++; return; } Node curr = this.head; // 遍历到最后一个节点就停止,不要走到null while (curr.next != null) { curr = curr.next; } curr.next = newNode; size++; }
另外你现有deleteAtTail方法也存在逻辑错误,无法正常删除尾节点,同步修复如下:
void deleteAtTail() { if (head == null) return; if (head.next == null) { head = null; size--; return; } Node curr = this.head; // 遍历到倒数第二个节点停止 while (curr.next.next != null) { curr = curr.next; } curr.next = null; size--; }
内容的提问来源于stack exchange,提问作者jattias96
相关产品推荐
相关产品推荐

