剑指offer【03】 从尾到头打印链表(4种实现方法)

题目:从尾到头打印链表

考点:链表

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

 

法一:ArrayList头插法

 1 /**
 2 *    public class ListNode {
 3 *        int val;
 4 *        ListNode next = null;
 5 *
 6 *        ListNode(int val) {
 7 *            this.val = val;
 8 *        }
 9 *    }
10 *
11 */
12 import java.util.ArrayList;
13 public class Solution {
14     //ArrayList头插法实现栈功能
15     ArrayList<Integer> list = new ArrayList<Integer>();
16     public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
17         while(listNode != null){
18            //0 是插入的为值  val 就是吧每次的值取出来插入到0的位置。其他之前的插入的向后顺序移动。
19            list.add(0,listNode.val);
20             listNode = listNode.next;
21         }
22         return list;
23     }
24 }

法二:使用Collections的reverse方法,将list反转

 1 /**
 2 *    public class ListNode {
 3 *        int val;
 4 *        ListNode next = null;
 5 *
 6 *        ListNode(int val) {
 7 *            this.val = val;
 8 *        }
 9 *    }
10 *
11 */
12 import java.util.Collections;
13 import java.util.ArrayList;
14 public class Solution {
15     ArrayList<Integer> list = new ArrayList<Integer>();
16     public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
17         while(listNode != null){
18            list.add(listNode.val);
19            listNode = listNode.next;
20         }
21         //使用Collections的reverse方法,直接将list反转
22         Collections.reverse(list);
23         return list;
24     }
25 }

法三:递归法

 1 /**
 2 *    public class ListNode {
 3 *        int val;
 4 *        ListNode next = null;
 5 *
 6 *        ListNode(int val) {
 7 *            this.val = val;
 8 *        }
 9 *    }
10 *
11 */
12 import java.util.ArrayList;
13 public class Solution {
14     //递归实现
15     ArrayList<Integer> list = new ArrayList<Integer>();
16     public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
17        if(listNode != null){
18            this.printListFromTailToHead(listNode.next);
19            list.add(listNode.val);
20        }
21        return list;
22     }
23 }

递归的点在printListFromTailToHaed(listNode.next)这个节点,那么在最后一次递归方法返回以后,每一层的递归方法都会做一个arrayList.add(lizxstNode.val)这个操作,从最后一次到第一次,逆向的调用了后面的方法。因为之前的递归点已经返回了。

法四:用栈实现

 1 /**
 2 *    public class ListNode {
 3 *        int val;
 4 *        ListNode next = null;
 5 *
 6 *        ListNode(int val) {
 7 *            this.val = val;
 8 *        }
 9 *    }
10 *
11 */
12 import java.util.Collections;
13 import java.util.ArrayList;
14 import java.util.Stack;
15 public class Solution {
16     ArrayList<Integer> list = new ArrayList<Integer>();
17     Stack<ListNode> stack = new Stack<ListNode>();
18     public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
19         while(listNode != null){
20             stack.push(listNode);
21             listNode = listNode.next;
22         }
23         //利用栈后进先出的特点实现翻转
24         while(!stack.isEmpty()){
25             list.add(stack.pop().val);
26         }
27         return list;
28     }
29 }
原文地址:https://www.cnblogs.com/linliquan/p/10583703.html