剑指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; } }