【剑指offer-java版】3、从尾到头打印链表

为了实习与秋招,立下flag两个月刷完剑指offer!ヾ(◍°∇°◍)ノ゙因为现在个人熟练度java>c++>python,所以代码都用java来写,有的题可能会用python,仅以此系列博文作为记录,所有代码均通过测试。

================================================================

时间限制:1秒  空间限制:32768K  热度指数:453567
本题知识点:  链表

题目描述

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

思路

利用栈的思想,最初我就是老老实实写了链表的反转,后来发现有大神写的递归,真的不要太简洁!速度也更快呢,还是要多多学习~

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
       ArrayList<Integer> arr=new ArrayList<Integer>();
       ArrayList<Integer> ans=new ArrayList<Integer>();
       while(listNode!=null){
           arr.add(listNode.val);
           listNode=listNode.next;
       }
       int n=arr.size();
       for(int j=0;j<n;j++){
           ans.add(arr.get(n-j-1));
       }
       return ans;
    }
}

运行时间:25ms

占用内存:8732k

Java简洁递归版
public class Solution {
    ArrayList<Integer> arrayList=new ArrayList<Integer>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode!=null){
            this.printListFromTailToHead(listNode.next);
            arrayList.add(listNode.val);
        }
        return arrayList;
    }
}  

运行时间:14ms

占用内存:9436k


复习:ArrayList的增删改查

1. ArrayList的增加方法

ArrayList使用方法add()对表进行元素添加

add(E e)是先通过ensureCapacityInternal()方法实现自身容量的增加一,为添加进来的元素提供存储的位置。然后把要添加的数据添加到elementDate[]的尾部。这个方法是布尔类型,在最后返回true。

add(int index, E element) 将指定的元素插入此列表中的指定位置。向右移动当前位于该位置的元素(如果有)以及所有后续元素(将其索引加 1)。方法首先判断指定位置index是否超出elementData的界限,然后通过通过ensureCapacityInternal()方法实现自身容量的增加一,然后用System.arraycopy()将index位置右侧的元素全部右移一位。把要插入的元素加入到index位置后,size增大一。


2. ArrayList的删除方法

remove是删除元素的方法

public E remove(int index)移除此列表中指定位置上的元素。向左移动所有后续元素(将其索引减 1)。 方法先判断是否越界,修改modCount的值,保存被删除的数据,产生新的数组的长度。然后把index位置右侧的元素全部左移一位,接着把末尾的元素置为null,并把大小-1,。最后返回的是被删除的数据

public boolean remove(Object o)移除此列表中首次出现的指定元素(如果存在)。如果列表不包含此元素,则列表不做改动。这个方法的代码在返回结果上有true和false两种,对应删除对象是否成功。remove(Object o)中通过遍历element寻找是否存在传入对象,一旦找到就调用fastRemove移除对象。

public void clear()移除此列表中的所有元素。此调用返回后,列表将为空。clear()方法只是将表的元素全部置为空,并不修改表的长度。


3. ArrayList的修改方法

set是修改元素的方法

public E set(int index, E element)用指定的元素替代此列表中指定位置上的元素。 首先检查范围,用新元素替换旧元素并返回旧元素。


4. ArrayList的查找方法

public E get(int index)返回此列表中指定位置上的元素。 先检查越界,然后直接返回index位置的数据。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值