从尾到头打印链表

 

题目描述

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

我的思路

       遍历列表,依次存入一个ArrayList中,然后再从后往前将其存入另一个ArrayList中

复杂度:

       这样的方法时间复杂度O(n),空间复杂度O(n);

/**
*    public class ListNode {
*        int val;//该节点存储的数值
*        ListNode next = null;//指向的下一个节点
*
*        ListNode(int val) {
*            this.val = val;//赋值
*        }
*    }
*
*/
import java.util.ArrayList;
//这里的listNode代表链表的第一个节点
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode == null){
            return new ArrayList<Integer>();
        }
        ArrayList<Integer> arrayList = new ArrayList<Integer>(); 
        while(listNode != null){
            arrayList.add(listNode.val);
            listNode = listNode.next;
        }
        ArrayList<Integer> newList = new ArrayList<Integer>(); 
        for(int i = arrayList.size()-1;i>=0;i--){//获取大小是size();刚开始我写的是length()
            newList.add(arrayList.get(i));
        }
        return newList;
    }
}

剑指Offer提供的解法:

       反转链表再打印,但需要像面试官询问能否改变链表的结构。如果不能改变,根据从后到前打印的特征,联想到栈的特点,使用栈来存储链表并输出(也可以每次到插入到arraylist的0位置)。既然栈可以,递归本质上也是一种栈结构,所以递归也可以实现。

栈存储:

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode == null){
            return new ArrayList<Integer>();
        }
        Stack<Integer> stack = new Stack<Integer>();//注意栈的使用方法
        ArrayList<Integer> arrayList = new ArrayList<Integer>(); 
        while(listNode != null){
            stack.push(listNode.val);
            listNode = listNode.next;
            
        }
        while(!stack.isEmpty()){//判断是否为空的方法
            arrayList.add(stack.pop()); 
        }
        return arrayList;
    }
}

递归存储:虽然知道就是一直递归调用方法,然后直到最后一个节点,再依次从最后一个节点打印出来。但是不知道怎么递归。。。看了作者的代码才知道,就循环调用这个打印的方法体就好了printListFromTailToHead。

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    ArrayList<Integer> arrayList = new ArrayList<Integer>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode == null){
            return new ArrayList<Integer>();
        }
        if(listNode.next != null){
            printListFromTailToHead(listNode.next);
        }
       
        arrayList.add(listNode.val);
        
        return arrayList;
    }
}


 

       

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值