Java链表反转迭代中打印变量值及解决空指针异常方法
解决链表反转中的空指针异常并实现变量打印
我来帮你分析问题根源,然后给出修复后的代码方案~
为什么会出现空指针异常?
你的代码里有两个明显触发NPE的点:
- 循环末尾访问
current.data:循环最后执行current = next,当处理到链表最后一个节点时,next是null,赋值给current后它就变成了null,此时再调用current.data自然会抛出空指针异常。 - 访问
current.next.data:当current是链表的最后一个节点时,current.next本身就是null,直接访问null.data也会触发NPE。
修复方案与优化后的代码
我们需要调整打印时机,同时对可能为null的变量做判空处理,确保打印时不会访问空对象的属性。下面是满足你需求的代码:
Node reverse(Node node) { Node prev = null; Node current = node; Node next = null; int iteration = 1; // 标记迭代次数,方便区分每一轮循环 while (current != null) { next = current.next; // 先保存当前节点的下一个节点(即你说的currentNext) // 打印当前迭代的所有目标变量 System.out.println("=== 第" + iteration + "次迭代 ==="); // current此时一定非空,直接打印data System.out.println("current: " + current.data); // prev可能为null,判空后打印 System.out.println("prev: " + (prev != null ? prev.data : "null")); // next(currentNext)可能为null,判空后打印 System.out.println("next(currentNext): " + (next != null ? next.data : "null")); // 执行链表反转的核心逻辑 current.next = prev; prev = current; current = next; // 可选:打印反转后的状态,观察prev和current的变化 System.out.println("反转后状态:prev = " + (prev != null ? prev.data : "null") + ", current = " + (current != null ? current.data : "null")); System.out.println("------------------------"); iteration++; } node = prev; return node; }
关键改动说明
- 调整打印位置:把打印操作移到
current = next之前,此时current被循环条件current != null保证为非空,避免了访问current.data的NPE。 - 判空处理:对
prev和next(也就是你要的currentNext)使用三元表达式,当变量为null时打印字符串"null",否则打印对应的data值,彻底避免空指针。 - 增加迭代标识:添加
iteration变量标记循环次数,让输出结果更清晰,方便你跟踪每一步的变量变化。 - 移除风险代码:删掉了原代码中
System.out.print(node.data+"R"),因为node在循环中始终指向原链表头节点,如果传入空链表的话这里也会触发NPE,且这个打印的实用价值不高。
内容的提问来源于stack exchange,提问作者RITESH KUMAR
相关产品推荐
相关产品推荐

