从尾到头打印链表

从尾到头打印链表

题目链接

https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tqId=11156&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github

题目描述

输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回) 。

如输入{1,2,3}的链表如下图:

img

返回一个数组为[3,2,1]

示例1

输入:

{1,2,3}

返回值:

[3,2,1]

示例1

输入:

{67,0,24,58}

返回值:

[58,24,0,67]

创建节点

节点里面只写了添加节点和打印节点两个方法

class LinkedNode{
    private int val;
    private LinkedNode next;

    public LinkedNode() {
    }

    public LinkedNode(int val) {
        this.val = val;
    }


    public int getVal() {
        return val;
    }

    public void setVal(int val) {
        this.val = val;
    }

    public LinkedNode getNext() {
        return next;
    }

    public void setNext(LinkedNode next) {
        this.next = next;
    }

    /**
        创建节点
     */
    public void add(int val) {
        LinkedNode node = new LinkedNode(val);
        if(this.next == null) {
            this.next = node;
        }else {
            this.next.add(val);
        }
    }

    /**
     * 输出链表
     */
    public void print() {
        System.out.print(this.val);
        if(this.next != null) {
            System.out.print("-->");
            this.next.print();
        }
    }
}

解法

第一种

第一种解法使用的是栈的特点,栈具有先进后出的功能

public static List<Integer> printNodeFromTailToHead(LinkedNode node) {
        Stack<Integer> stack = new Stack<>();
        //往栈中添加节点
        while (node != null) {
            stack.add(node.getVal());
            node = node.getNext();
        }

        List<Integer> list = new ArrayList<>();
        //从栈中取出节点添加到集合中
        while (!stack.isEmpty()) {
            list.add(stack.pop());
        }
        return list;
    }

第二种

使用集合类中的add(index,value)方法,根据索引位置插入元素,如果该位置有元素,该位置的元素就要往后移

public static List<Integer> printNodeFromTailToHead2(LinkedNode node) {
        ArrayList<Integer> list = new ArrayList<>();
        while (node != null) {
            list.add(0,node.getVal());
            //把下个节点赋值给当前节点重新判断
            node = node.getNext();
        }
        return list;
    }

第三种

使用递归的方式 不能把集合放在方法里面,不然每次递归都会初始化的

static ArrayList<Integer> list = new ArrayList();
public static List<Integer> printNodeFromTailToHead3(LinkedNode node) {
    if(node != null){
        printNodeFromTailToHead3(node.getNext());
        list.add(node.getVal());
    }
    return list;
}

验证

public static void main(String[] args) {
        LinkedNode node = new LinkedNode();
        node.add(1);
        node.add(2);
        node.add(3);
        node.print();

        System.out.println();

        //List<Integer> list = printNodeFromTailToHead(node);
        //System.out.println(list);

        //List<Integer> list = printNodeFromTailToHead2(node);
        //System.out.println(list);

        List<Integer> list = printNodeFromTailToHead3(node);
        System.out.println(list);
    }
posted @   China熊孩子  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示