求助:链表元素逆序输出问题排查(HackerRank刷题)
问题排查与修正方案
嘿,我一眼就看出你代码里的问题啦!你的核心错误是把链表元素逆序输出和元素降序排序输出搞混了,这完全是两个不同的需求哦。
问题分析
你当前的代码里,用了Collections.sort(intList, Collections.reverseOrder())这个操作——它会把列表里的元素按从大到小的顺序重新排列,而不是按照原链表的顺序反过来输出。举个例子:
- 如果原链表是
1 -> 3 -> 2 - 你的代码会输出
3、2、1(排序后的降序) - 但题目要求的逆序输出应该是
2、3、1(原链表的倒序)
这就是你的解法无法通过测试的原因!
修正方案
这里给你三种简单的修正思路,任选其一都可以解决问题:
方案1:反向遍历存储的列表(最贴近你的原代码)
只需要去掉排序的代码,改成从列表的末尾往前遍历输出即可:
static void reversePrint(SinglyLinkedListNode head) { if (head == null){ return; } ArrayList<Integer> intList = new ArrayList<>(); while(head != null){ intList.add(head.data); head = head.next; } // 去掉排序,改成反向遍历 for(int i = intList.size() - 1; i >= 0; i--) { System.out.println(intList.get(i)); } }
方案2:用栈实现(更符合链表逆序的逻辑)
利用栈“后进先出”的特性,遍历链表时把元素压入栈,再依次弹出输出:
static void reversePrint(SinglyLinkedListNode head) { if (head == null) { return; } Stack<Integer> stack = new Stack<>(); while(head != null) { stack.push(head.data); head = head.next; } while(!stack.isEmpty()) { System.out.println(stack.pop()); } }
方案3:递归实现(代码最简洁)
借助递归调用的栈帧,先递归到链表末尾,再回溯输出当前节点的元素:
static void reversePrint(SinglyLinkedListNode head) { if (head == null) { return; } // 先递归处理下一个节点 reversePrint(head.next); // 回溯时输出当前节点的数据 System.out.println(head.data); }
总结
只要把错误的排序操作替换成真正的“逆序输出”逻辑,你的代码就能通过测试啦~
内容的提问来源于stack exchange,提问作者Nathanael
相关产品推荐
相关产品推荐

