PaddleHub join websocket server enums uiviewcontroller vue中文网 list获取最后一个元素 oracle添加索引 bootstrap颜色 oracle可视化工具 vue与html5 车载u盘 python学习 python获取数据类型 python基本语法 python正则匹配 python的安装 python命令行参数 python抛异常 python中set的用法 python写入文件 javatrim java方法重载 java课程学习 java程序 java文件重命名 java实例变量 java当前日期 java8函数式编程 python教程下载 millenium hexworkshop fireworks8 橄榄山快模 findall 语音分析软件 幽灵行动多少钱 js字符转数字 flushdns
当前位置: 首页 > 学习教程  > 编程语言

43.剑指Offer之从尾到头打印链表

2020/7/24 11:18:29 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

目录

    • 1题目描述:
    • 2.解题思路
    • 3.编程实现(Java):

1题目描述:

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

2.解题思路

  三种方法:借助栈、递归、列表的首位插入

  从头到尾打印链表比较简单,从尾到头很自然的可以想到先将链表进行反转,然后再打印。但是,通常我们不希望改变原链表的结构,这是一个只读操作。因此,我们进一步分析,可以发现排在后面的先输出,这是一个典型的“后入先出”的思想,因此很自然的可以想到用栈来实现,每遍历一个结点,可以将其压入栈中,遍历结束后再逐个弹栈,将结点值存入ArrayList,这样就实现了从尾到头的打印。

  更进一步,既然想到了用栈,那一定可以通过递归来实现。每访问到一个结点,先递归输出其后的结点,在输出该结点自身即可。

  另外,当我们使用Java或者python语言时,有一种比较巧妙的方法就是使用列表的插入方法,每次插入数据,都总是插入到首位,之前的数据就会后移,这样得到的List就是从尾到头的链表序列。

3.编程实现(Java):

public class printListFromTailToHead_43 {
    //方法一:借助栈的后入先出实现
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<>();
        if (listNode == null)
            return list;
        Stack<ListNode> stack = new Stack<>();
        ListNode head = listNode;
        while (head != null) {
            stack.push(head);
            head = head.next;
        }
        while (!stack.isEmpty()) {
            ListNode temp = stack.pop();
            list.add(temp.val);
        }
        return list;
    }

    //方法二:递归实现
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList();
        getNext(listNode, list);
        return list;
    }

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

    //方法三:列表的首位插入
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<>();
        if (listNode == null)
            return list;
        ListNode head = listNode;
        while (head != null) {
            list.add(0, head.val);
            head = head.next;
        }
        return list;
    }
}

本文链接: http://www.dtmao.cc/news_show_50392.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?