CodeFights链表插入题出现NullPointerException,求原因及解决
分析你的链表插入代码问题及修复方案
我来帮你拆解下代码里导致NullPointerException的核心问题,以及逻辑上的漏洞:
1. 最致命的问题:返回值完全错误
你最后返回的是curr,但循环结束后curr已经走到了链表的末尾(变成null),不管你有没有成功插入节点,最终都会返回null。调用方拿到这个null后,只要尝试访问节点的data或next属性,必然会抛出NullPointerException。正确的做法是返回原链表的头节点head(只有在头部插入的情况,你已经正确返回了新节点)。
2. 循环逻辑的冗余与边界隐患
你用counter+1 == position来判断插入位置,虽然逻辑上能找到目标位置的前一个节点,但插入完成后没有跳出循环,会继续遍历到链表末尾,做无用功。另外,如果传入的position等于链表的长度(比如链表有3个节点,插入到位置3),你的代码虽然能执行插入,但因为返回值错误,最终还是会返回null,导致整个链表丢失。
修复后的代码
Node InsertNth(Node head, int data, int position) { Node insert = new Node(); insert.data = data; insert.next = null; // 处理头部插入(包括head为空且position为0的情况) if (position == 0) { insert.next = head; return insert; } Node curr = head; int counter = 0; // 找到目标位置的前一个节点(counter == position - 1) while (curr != null && counter < position - 1) { curr = curr.next; counter++; } // 这里默认position是合法的(题目应该保证输入有效) insert.next = curr.next; curr.next = insert; // 返回原链表头(头部插入的情况已经提前返回了) return head; }
修复点说明
- 合并了头部插入的逻辑:不管原链表是否为空,只要
position是0,直接将新节点作为新头返回,覆盖了head为空的边界场景。 - 调整循环逻辑:直接定位到目标位置的前一个节点(
counter == position - 1),逻辑更直观,避免了counter+1的绕弯判断。 - 固定返回值:除了头部插入的特殊情况,始终返回原
head,保证链表结构不丢失,从根源避免了返回null导致的空指针异常。 - 若题目允许
position等于链表长度(插入到末尾),这段代码也能正常处理;如果遇到非法的position(超过链表长度),可以在循环后加if (curr == null)的判断来做容错处理。
内容的提问来源于stack exchange,提问作者Sadaf Chowdhury
相关产品推荐
相关产品推荐

