Java单链表指定位置插入元素代码运行输出大量1错误排查
代码问题分析
- 新节点赋值逻辑错误:创建
SinglyLinkedListNode对象后,立刻执行newNode = temp,直接覆盖了新创建的节点对象,相当于没有生成要插入的新节点,所有对newNode的操作实际都是操作原链表的节点。 - 头插(
pos=0)分支逻辑完全错误:现有代码只是把原head重新赋值给head变量,根本没有完成新节点插入。正确头插逻辑应该是:新节点的next指针指向原head,再把head变量指向新节点。 - 非头插(
pos>0)分支逻辑混乱:- 开头直接执行
newNode = temp、head = newNode,直接丢失了原链表的头节点引用 - 循环中一直操作
head指针而不是移动临时遍历指针,遍历逻辑完全错误,应该先将临时指针移动到pos的前一个节点,再执行插入 - 插入逻辑错误,你写的
head.next = newNode; newNode = temp既没有把新节点和后续链表接上,还很容易产生链表环,遍历链表时就会无限循环输出重复值,也就是你看到的大量1的原因。
- 开头直接执行
- 缺少边界校验:没有处理空链表、
pos大于等于链表长度的异常场景。
修复后的代码
public static SinglyLinkedListNode insert_at_position(SinglyLinkedListNode head, int val, int pos) { // 空链表或者插头部的情况 if (pos == 0 || head == null) { SinglyLinkedListNode newNode = new SinglyLinkedListNode(val); newNode.next = head; return newNode; } // 遍历到pos的前一个节点 SinglyLinkedListNode temp = head; for (int i = 0; i < pos - 1; i++) { // 已经到链表尾还没到pos,直接返回原头节点 if (temp.next == null) { return head; } temp = temp.next; } // 插入新节点 SinglyLinkedListNode newNode = new SinglyLinkedListNode(val); newNode.next = temp.next; temp.next = newNode; return head; }
内容的提问来源于stack exchange,提问作者wonderfulLife
相关产品推荐
相关产品推荐

