题目描述:
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
题目来源:牛客网
分析:ArrayList
都明说了,因此这里知道熟悉ArrayList
的add()
方法的重载,就可以知道,除了平时经常用的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)。这个方法!