剑指Offer(链表)-从尾到头打印链表
(从尾到头打印链表)题目描述:
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
解题思路一:利用ArrayList原生态的add方法
(1)ArrayList的add方法具有其原生态的特点,利用list.add(index,value)来实现在指定位置处插入元素,并且在插入位置处将其后的元素整体往后挪一位,由于要求将输入的ListNode链表实现从尾到头的顺序返回一个ArrayList,那就是要将此链表的数据按照从尾到头的顺序插入到ArrayList中去,即“后进先出”,即可用ArrayList实现栈的思想。那么就可以一直在首位置插入链表的元素,那么最先插入的元素就会一直被推到最后去。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
ListNode current = listNode;
while(current!=null){
list.add(0,current.val);
current = current.next;
}
return list;
}
}
(2)ArrayList原生态的add方法:保证当前elementData数组容量够用, 然后把从index处一直到尾部的数组元素都向后挪一位。最后把要插入的元素赋给数组的index处。
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++;
}
(3)用ArrayList实现栈:
public class ArrayListDemo{
/**
* @param args
*/
//用这三种方法实现一个栈
private static ArrayList<Object> list=new ArrayList<Object>();
//判断占是否为空
public static boolean isStackEmpty(){
return list.isEmpty()?true:false;
}
//入栈
public static void push(Object obj){
list.add(obj);
}
//出栈
public static void pop(){
Object obj=null;
if(!list.isEmpty()){
obj=list.get(list.size()-1);
System.out.println(obj);
list.remove(obj);
}else{
return;
}
}
//获取栈的元素个数
public int getLength(){
return list.size();
}
}
解题思路二:递归的思想
在递归的时候,调用printListFromTailToHead(listNode)和list.add(listNode.val)是不相互冲突的,这就将反复调用链表中的下一个节点交给了系统来完成。
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> list = new ArrayList<>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode!=null){
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
}

浙公网安备 33010602011771号