返回
算法连载(第三期) 详解:从尾到头打印链表
前端
2024-02-05 23:55:47
从尾到头打印链表,看似简单,但想要编写出高效、易懂的代码,却需要一定的算法功底。本期算法连载,我们将深入剖析这一问题,为你提供清晰的解题思路和代码实现。
问题陈述:
给定一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
思路分析:
从尾部到头部的遍历本质上是一种深度优先的遍历方式。深度优先搜索(DFS)是一种递归算法,通过不断深入当前节点的子节点,直到不能再深入时,再回溯到父节点继续遍历。
代码实现:
import java.util.ArrayList;
import java.util.List;
public class ReverseLinkedList {
public static List<Integer> reverseLinkedList(ListNode head) {
List<Integer> result = new ArrayList<>();
reverseLinkedListHelper(head, result);
return result;
}
private static void reverseLinkedListHelper(ListNode node, List<Integer> result) {
if (node == null) {
return;
}
// 递归调用,先遍历子节点
reverseLinkedListHelper(node.next, result);
// 回溯到父节点,将节点值添加到结果列表中
result.add(node.val);
}
public static void main(String[] args) {
// 创建一个链表
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
// 从尾到头打印链表
List<Integer> result = reverseLinkedList(head);
System.out.println(result); // 输出:[4, 3, 2, 1]
}
}
// 链表节点定义
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
代码详解:
- 首先创建一个空列表
result
来存储逆序遍历的结果。 - 调用辅助函数
reverseLinkedListHelper
,使用深度优先遍历链表,并逐个将节点值添加到result
列表中。 reverseLinkedListHelper
函数使用递归的方式,先遍历当前节点的子节点,再回溯到父节点,并把节点值添加到结果列表中。main
函数创建一个链表,调用reverseLinkedList
函数获得逆序遍历的结果,并打印出来。
注意事项:
- 使用深度优先遍历,需要确保递归不会陷入死循环。
- 在递归的过程中,注意栈空间的使用。
- 对于复杂的问题,可以考虑使用非递归的方式(例如使用栈)来解决,避免栈溢出的风险。