• 剑指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 }
  • 相关阅读:
    POJ 1328 Radar Installation
    POJ 1700 Crossing River
    POJ 1700 Crossing River
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3069 Saruman's Army(贪心)
    poj 3069 Saruman's Army(贪心)
    Redis 笔记与总结2 String 类型和 Hash 类型
    数据分析方法有哪些_数据分析方法
    数据分析方法有哪些_数据分析方法
  • 原文地址:https://www.cnblogs.com/linliquan/p/10583703.html
Copyright © 2020-2023  润新知