返回

算法连载(第三期) 详解:从尾到头打印链表

前端

从尾到头打印链表,看似简单,但想要编写出高效、易懂的代码,却需要一定的算法功底。本期算法连载,我们将深入剖析这一问题,为你提供清晰的解题思路和代码实现。

问题陈述:

给定一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

思路分析:

从尾部到头部的遍历本质上是一种深度优先的遍历方式。深度优先搜索(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 函数获得逆序遍历的结果,并打印出来。

注意事项:

  • 使用深度优先遍历,需要确保递归不会陷入死循环。
  • 在递归的过程中,注意栈空间的使用。
  • 对于复杂的问题,可以考虑使用非递归的方式(例如使用栈)来解决,避免栈溢出的风险。