• 剑指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 }
  • 相关阅读:
    C语言I博客作业06
    C语言I博客作业05
    C语言I博客作业04
    C语言I博客作业03
    C语言I博客作业02
    第一次作业
    C语言I博客作业09
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
  • 原文地址:https://www.cnblogs.com/linliquan/p/10583703.html
Copyright © 2020-2023  润新知