美文网首页
从尾到头打印链表

从尾到头打印链表

作者: 囧略囧 | 来源:发表于2019-06-22 16:14 被阅读0次

题目描述

输入一个链表,从尾到头打印链表每个节点的值。

这个问题应该是很常见的,如何把一个单向链表进行从尾到头的输出。

方法一:按照我的习惯一般喜欢先考虑牺牲空间的做法。由于是最先读到的链表头需要最后输出,这是典型的栈结构特点,所以这里可以构建一个栈。将链表的内容依次存入栈,再从栈中取出即可。

public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        Stack<Integer> stack=new Stack<Integer>();
        while(listNode!=null){
            stack.push(listNode.val);
            listNode=listNode.next;     
        }
        ArrayList<Integer> list=new ArrayList<Integer>();
        while(!stack.isEmpty())
            list.add(stack.pop());
        return list;
    }
}

其实用数组,队列等也能实现。下面是数组版的,原理都大同小异。

public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        int count = 0;
        while(listNode.next != null) count++;
        int[] tmp = new int[count];
        for(int i = count - 1; i >= 0; i--) {
            tmp[i] = listNode.val;
            listNode = listNode.next;
        }
        for(int i = 0; i < count; i++) {
            res.add(tmp[i]);
        }
        return res;
    }
}

方法二:既然用栈可以解决问题,那么用递归应该也一样,毕竟递归的本质也是一个栈结构。

public class Solution {
    ArrayList<Integer> res = new ArrayList<Integer>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode != null) {
                //只是为了遍历,返回值不关心
            printListFromTailToHead(listNode.next);
            res.add(listNode.val);
        }
        return res;
    }
}

另一种递归思路,利用返回值,返回的是当前节点之后的所有节点。

public class Solution {
    public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if(listNode == null) return res;
        if(listNode.next != null) 
                res = printListFromTailToHead(listNode.next);
        res.add(listNode.val);
        return res;
    }
}

方法三:一般默认的是不修改输入数据,但是如果可以修改输入数据的话,我们只要将链表进行反转就可以实现要求。

public class Solution {
    public ArrayList&lt;Integer&gt; printListFromTailToHead(ListNode listNode) {
        ArrayList&lt;Integer&gt; res = new ArrayList&lt;Integer&gt;();
        ListNode current = listNode;
        ListNode newhead = null;
        ListNode next = null;
        while(current != null) {
            next = current.next;     //进行断链并保存之后节点
            current.next = newhead; //断链重接,接到前半部分的头
            newhead = current;       //更新头
            current = next;          //更新需要断链的位置
        }
        while(newhead != null) {
            res.add(newhead.val);
            newhead = newhead.next;
        }
        return res;
    }
}
#

原理大致就是这个样子,画的不好凑合着看吧。

相关文章

  • JZ-003-从尾到头打印链表

    从尾到头打印链表 题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。题目链接: 从尾到头打印...

  • 2.3.3 链表

    面试题6:从尾到头打印链表 输入一个链表,从尾到头打印链表每个节点的值。

  • 06:从尾到头打印链表

    题目06:从尾到头打印链表 输入一个链表,从尾到头打印链表每个节点的值。 思路 一. 栈 从头遍历链表,先访问的后...

  • 《剑指offer》— JavaScript(3)从尾到头打印链表

    从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值。 实现代码 相关知识 链表是一种物理存储单...

  • <<剑指offer>>--javascript(3)-从尾到头打

    从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值 代码如下 解题思路 链表是一种物理存储单元...

  • 从尾到头打印链表

    从尾到头打印链表 题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 分析 listNode...

  • 从尾到头打印链表

    《剑指offer》面试题6:从尾到头打印链表 题目:输入一个链表的头节点,从尾到头反过来打印出每个节点的值。(链表...

  • 《剑指Offer》链表考点题解

    题目链接:从尾到头打印链表 题目简述: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 题目思路 ...

  • 剑指Offer -- 从尾到头打印链表(C++)

    题目描述 输入一个链表,从尾到头打印链表每个节点的值。 方法1:注意是从尾到头进行打印,可利用vector的头插法...

  • Day3 剑指offer:逆序链表

    输入一个链表,从尾到头打印链表每个节点的值。

网友评论

      本文标题:从尾到头打印链表

      本文链接:https://www.haomeiwen.com/subject/jakvqctx.html