C#实现单链表插入4元素仅显示2个 insert方法错误排查
问题根因
错误出在insert方法的遍历逻辑:查找链表尾节点时直接修改了传入的head参数引用,没有使用临时变量保存遍历指针,导致插入第3个及之后的节点时,方法返回的不是链表原始头节点,而是遍历过程中走到的中间/尾节点,靠前的节点直接丢失引用,最终遍历只能输出最后2个节点。
逐次插入的实际执行逻辑:
- 插入第1个值2:头节点为空,直接返回2节点,链表头正确指向2
- 插入第2个值3:传入头节点为2,
head.next为空不进入循环,把3挂到2的next位,返回头节点2,此时链表为2->3,头指向正确 - 插入第3个值4:传入头节点为2,进入循环判断
head.next=3不为空,直接把head指针移动到3节点,退出循环后把4挂到3的next位,此时返回的是3节点,外层Main方法里的链表头被更新为3,最开头的2节点丢失引用,链表变为3->4 - 插入第4个值1:传入头节点为3,进入循环判断
head.next=4不为空,把head指针移动到4节点,退出循环后把1挂到4的next位,返回4节点,外层链表头被更新为4,3节点丢失引用,最终链表只剩4->1,遍历只能输出2个值
修复方法
修改insert方法,在else分支定义临时遍历指针,不要改动原始传入的head引用,修复后的insert代码如下:
public static Node insert(Node head, int data) { Node newNode = new Node(data); if (head == null) { head = newNode; } else { // 定义临时指针遍历找尾节点,不修改原始head Node current = head; while (current.next != null) { current = current.next; } current.next = newNode; } return head; }
其余display、Main、Node类的代码不需要改动,修复后运行会正确输出2 3 4 1。
注:链表尾插法的核心要求是尾插过程中始终保留头节点的引用,一旦遍历过程中直接移动头节点指针,没有其他引用指向靠前的节点时,这部分节点会被垃圾回收,造成链表数据丢失。
内容的提问来源于stack exchange,提问作者UniqueHold
相关产品推荐
相关产品推荐

