Java实现单链表反向打印无预期输出 定位为add方法节点添加失效
问题根因定位
- Java 值传递特性导致的引用丢失:所有方法参数传递都是值拷贝,你调用
add(list.head, value)时,传入的list.head(初始为null)仅作为副本传递给方法的形参,方法内部修改这个局部副本的指向,完全不会影响外部SinglyLinkedList实例的head属性。整个链表初始化完成后始终为空,后续遍历自然拿不到任何元素。 - 原
add方法的链表构建逻辑缺陷:- 即便解决了引用丢失问题,现有逻辑只要头节点非空,就直接把
head.next指向新节点,全程没有遍历到链表尾部,每新增一个节点都会覆盖之前的链表连接,丢失已加入的节点 - 方法末尾的
current = node;是无效操作:current是方法内的局部变量,对它的赋值不会修改任何已存在节点的next指针 - 类中定义的
tail属性完全没有被利用,反而增加了无意义的逻辑冗余
- 即便解决了引用丢失问题,现有逻辑只要头节点非空,就直接把
- 需求匹配偏差:最终目标是反向打印链表,现有代码即使把链表构建正确,
insert方法也只是正向把元素存入ArrayList,后续直接打印整个ArrayList,没有实现逆序输出的要求。
修复方案
- 调整
add方法入参:传入完整的SinglyLinkedList实例,不再单独传递head节点,这样方法内部可以直接修改链表实例的head、tail属性,绕开值传递带来的引用失效问题 - 重写尾插逻辑:利用已有的
tail属性实现O(1)尾插,不需要循环遍历找尾部节点:- 链表为空时,将
head和tail同时指向新节点 - 链表非空时,直接让
tail.next指向新节点,再把tail移动到新节点位置
- 链表为空时,将
- 补充反向打印逻辑:正向遍历把元素存入ArrayList后,从ArrayList的最后一个元素开始反向遍历输出,完成反向打印需求
修复后可运行代码
import java.util.*; public class printReverse { static class Node { public int data; public Node next; public Node(int data) { this.data = data; this.next = null; } } static class SinglyLinkedList { public Node head; public Node tail; public SinglyLinkedList() { this.head = null; this.tail = null; } } // 传入完整链表实例实现节点插入 static void add(SinglyLinkedList list, int data) { Node node = new Node(data); if (list.head == null) { // 空链表初始化头尾节点 list.head = node; list.tail = node; } else { // 尾插直接修改尾节点的next指针 list.tail.next = node; list.tail = node; } } // 正向遍历链表存入列表 static void insert(Node head, ArrayList<Integer> a) { Node current = head; while (current != null) { a.add(current.data); current = current.next; } } public static void main(String[] args) { Scanner scan = new Scanner(System.in); int t = scan.nextInt(); for (int i = 0; i < t; i++) { SinglyLinkedList list = new SinglyLinkedList(); int n = scan.nextInt(); for (int j = 0; j < n; j++) { int value = scan.nextInt(); add(list, value); } ArrayList<Integer> array = new ArrayList<>(); insert(list.head, array); // 反向遍历输出 for (int k = array.size() - 1; k >= 0; k--) { System.out.print(array.get(k) + " "); } System.out.println(); } scan.close(); } }
内容的提问来源于stack exchange,提问作者Rushi Kadivar
相关产品推荐
相关产品推荐

