offer3:j将链表从尾到头的顺序返回成ArrayList集合记录。
从尾到头打印链表
http://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035
题目描述:
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
有两种方法,递归和非递归方法:
1.非递归
listNode 是链表,只能从头遍历到尾,但是输出却要求从尾到头,这是典型的"先进后出",我们可以想到栈!
ArrayList 中有个方法是 add(index,value),可以指定 index 位置插入 value 值
add(index,value)用于在列表的指定位置插入指定元素,并将当前处于该位置的元素及其后续元素的索引加1
所以在遍历 listNode 的同时将每个遇到的值插入到 list 的 0 位置,最后输出 listNode 即可得到逆序链表
public static ArrayList<integer> getListFromTailToHead(ListNode listNode) {</integer>
ArrayList<Integer> list = new ArrayList<Integer>(); while(listNode!=null){ list.add(0,listNode.val); listNode=listNode.next; }//add(index,value)用于在列表的指定位置插入指定元素,并将当前处于该位置的元素及其后续 return list; }
2.递归方法
借助系统的栈思想,可以实现递归的打印出由后到头的链表
ArrayList<integer> list = new ArrayList();
public ArrayList<integer> printListFromTailToHead(ListNode listNode) {</integer></integer>
if(listNode!=null){ printListFromTailToHead(listNode.next); list.add(listNode.val); } return list; }
补充下链表的增加新节点方法:
class ListNode {
int val;
ListNode next = null;
ListNode(int val) { this.val = val; }//新增节点 public void add(int newVal) { ListNode newNode=new ListNode(newVal); if(this.next==null){ this.next=newNode; }else { this.next.add(newVal); } } }