剑指Offer-02——从尾到头打印链表

题目描述:
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
题目来源:牛客网

分析:ArrayList都明说了,因此这里知道熟悉ArrayListadd()方法的重载,就可以知道,除了平时经常用的add(E e)方法,add(int index,E e)方法可以指定在某处添加一个元素。

    /**
     * Inserts the specified element at the specified position in this 在链表的特殊位置,插入一个指定的元素
     * list. Shifts the element currently at that position (if any) and 
     * any subsequent elements to the right (adds one to their indices).
     * 如果当前位置有元素,则向右移动当前位于该位置的元素以及所有后续元素(将其索引加1)
     *
     * @param index index at which the specified element is to be inserted
     * @param element element to be inserted
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }

这个add(int index,E element)方法,可以指定将元素加入的位置,而该位置如果原本有元素,就会被右移(下标+1)。在本题中:如果我们一直将元素加入到下标为0的位置,(注意:ArrayList的底层是数组),先加入的元素的位置就会一直向右移动。

加入add(0,1),数组中:[1]
加入add(0,2),数组中:[2,1]
加入add(0,3),数组中:[3,2,1]
代码:

public class Offer_03 {
    public static void main(String[] args) {
        ListNode listNode = new ListNode(1);
        ListNode listNode1 = new ListNode(2);
        ListNode listNode2 = new ListNode(3);
        listNode.next = listNode1;
        listNode1.next= listNode2;
        listNode2.next = null;
        System.out.println(printListFromTailHead(listNode).toString());
    }
    public static ArrayList<Integer> printListFromTailHead(ListNode listNode){
        ArrayList<Integer> list = new ArrayList<Integer>();
        while (listNode!=null){
            list.add(0,listNode.val);
            listNode = listNode.next;
        }
        return list;
    }
}
 class ListNode {
         int val;
         ListNode next = null;
         ListNode(int val) {
             this.val = val;
         }
     }

嗯,收获了一个ArrayList.add(int index,E element)。这个方法!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值