从尾到头打印链表

问题描述

输入一个链表的头结点,按链表从尾到头的顺序返回一个ArrayList。

解法1:反转链表

 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {

        ArrayList<Integer> arrayList = new ArrayList<>();
        // 判空
        if (listNode == null) {
            return arrayList;
        }
        ListNode head = reverse(listNode);
        // 将结点数据写入arrayList
        do {
            arrayList.add(head.val);
        } while ((head = head.next) != null);
        return arrayList;
    }

    /**
     * 链表转置
     * @param head
     * @return
     */
    public ListNode reverse(ListNode head) {
        // 返回的头 原来链表的尾
        ListNode rNode = null;
        ListNode node = head;
        ListNode preNode = null;

        while (node != null) {
            // 记录当前节点的下一个节点
            ListNode nextNode = node.next;
            // 下一个结点为null 则当前结点node为尾结点
            if (nextNode == null) {
                rNode = node;
            }
            // 交换指针
            node.next = preNode;
            preNode = node;
            node = nextNode;
        }

        return rNode;
    }

解法2:

使用栈结构 推荐**

 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {

        ArrayList<Integer> arrayList = new ArrayList<>();
        // 判空
        if (listNode == null) {
            return arrayList;
        }

        Stack<Integer> stack = new Stack<>();
        do {
            // 链表数据进栈
            stack.push(listNode.val);
        } while ((listNode = listNode.next) != null);

        while (!stack.empty()){
            // 堆栈数据添加到list集合
            arrayList.add(stack.pop());
        }
        return arrayList;
    }

解法3:

递归

方法的重载:方法参数不同即可(类型或者参数个数 和返回参数和参数名无关)

 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        // 判空
        if (listNode == null) {
            return arrayList;
        }
        printListFromTailToHead(arrayList, listNode);
        return arrayList;
    }

    public void printListFromTailToHead(ArrayList<Integer> arrayList, ListNode listNode) {
        if (listNode != null) {
            if (listNode.next != null) {
                printListFromTailToHead(arrayList, listNode.next);
            }
            arrayList.add(listNode.val);
        }
    }

posted @   iforeverhz  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示