zoukankan      html  css  js  c++  java
  • 剑指offer编程题Java实现——面试题5从头到尾打印链表

    题目描述* 剑指offer面试题5:从尾到头打印链表

    输入一个链表的头结点,从尾到头打印出每个结点的值

    解决方案一:首先遍历链表的节点后打印,典型的“后进先出”,可以使用栈来实现这种顺序。
    解决方案二:栈的本质就是递归,直接使用递归的方式,打印一个节点的时候先打印它后面的节点,再打印该节点自身,实现反向打印
    解决方案三:遍历链表,把链表中的元素复制到ArrayList中,然后逆序打印ArrayList中的元素,由于ArrayList底层使用数组实现,所以用数组也是同样的原理
    解决方案四:前三种解决方案本身属于在打印链表的时候不修改链表本身结构,在允许修改链表结构的情况下可以把链表中的节点指针反转过来,改变链表方向,然后重新遍历打印改变方向后的链表。

     
      1 package Solution;
      2 
      3 import java.util.ArrayList;
      4 import java.util.Stack;
      5 
      6 /**
      7  * 剑指offer面试题5:从尾到头打印链表
      8  * 输入一个链表的头结点,从尾到头打印出每个结点的值
      9  * 解决方案一:首先遍历链表的节点后打印,典型的“后进先出”,可以使用栈来实现这种顺序。
     10  * 解决方案二:栈的本质就是递归,直接使用递归的方式,打印一个节点的时候先打印它后面的节点,再打印该节点自身,实现反向打印
     11  * 解决方案三:遍历链表,把链表中的元素复制到ArrayList中,然后逆序打印ArrayList中的元素
     12  * 解决方案四:前三种解决方案本身属于在打印链表的时候不修改链表本身结构,
     13  * 在允许修改链表结构的情况下可以把链表中的节点指针反转过来,改变链表方向,然后重新遍历打印改变方向后的链表
     14  * @author GL
     15  *
     16  */
     17 public class No5PrintListFromTailToHead {
     18 
     19     public static void main(String[] args) {
     20         ListNode node1=new ListNode(1);
     21         ListNode node2=new ListNode(2);
     22         ListNode node3=new ListNode(3);
     23         ListNode node4=new ListNode(4);
     24         ListNode node5=null;
     25         ListNode node6=new ListNode(6);
     26         ListNode node7=new ListNode();
     27         node1.next=node2;
     28         node2.next=node3;
     29         node3.next=node4;
     30         printListFromTailToHead(node1);
     31         printListFromTailToHead(node5);
     32         printListFromTailToHead(node6);
     33         printListFromTailToHead(node7);
     34         //使用栈实现逆序打印链表
     35         printListFromTailToHeadByStack(node1);
     36         //使用递归实现逆序打印链表
     37         printListFromTailToHead(node1);
     38         //使用递归反转实现逆序打印
     39         printListFromTailToHeadByReverseList(node1);
     40         //使用ArrayList逆序打印链表
     41         printListFromTailToHeadByArrayList(node1);
     42     }
     43     
     44     /*
     45      * 方案一:通过使用栈结构,遍历链表,把先遍历的节点的值推入栈中,遍历结束后通过弹出栈内元素实现逆序打印 
     46      */
     47     public static void printListFromTailToHeadByStack(ListNode node){
     48         Stack<Integer> stack=new Stack<Integer>();
     49         while(node!=null){
     50             stack.push(node.val);
     51             node=node.next;
     52         }
     53         while(!stack.isEmpty()){
     54             System.out.print(stack.pop()+",");
     55         }
     56     }
     57 
     58     
     59     /*
     60      * 方案二:递归法逆序打印链表
     61      */
     62     public static void printListFromTailToHead(ListNode node){
     63         if(node!=null){
     64             if(node.next!=null){
     65                 printListFromTailToHead(node.next);
     66             }
     67             System.out.print(node.val+",");
     68         }
     69         else
     70             System.out.println("输入的链表为空");
     71     }
     72     
     73     /*
     74      * 方案三:使用ArrayList逆序打印链表
     75      */
     76     public static void    printListFromTailToHeadByArrayList(ListNode node){
     77         if(node==null)
     78             System.out.print("输入链表为null");
     79         ArrayList<Integer> arrayList=new ArrayList<Integer>();
     80         while(node!=null){
     81             arrayList.add(node.val);
     82             node=node.next;
     83         }
     84         for(int i=arrayList.size()-1;i>=0;i--){
     85             System.out.print(arrayList.get(i)+",");
     86         }
     87     }
     88     
     89     
     90     /*
     91      * 方案四:递归反转链表,后遍历打印
     92      */
     93     public static void printListFromTailToHeadByReverseList(ListNode node){
     94         ListNode reversedNode=reverse(node);
     95         while(reversedNode!=null){
     96             System.out.print(reversedNode.val+",");
     97             reversedNode=reversedNode.next;
     98         }
     99         
    100     }
    101     //递归反转
    102     private static ListNode reverse(ListNode head){
    103         if(head.next==null)
    104             return head;
    105         ListNode reversedListNode=reverse(head.next);
    106         head.next.next=head;
    107         head.next=null;
    108         return reversedListNode;
    109     }
    110 
    111 }
    112 class ListNode{
    113     int val;
    114     ListNode next=null;
    115     public ListNode(){
    116     
    117     }
    118     public ListNode(int value){
    119         this.val=value;
    120     }
    121 }
  • 相关阅读:
    android activity lifecycle
    android hal 分析
    android hardware.c 源码分析
    linux cpio
    android boot.img unpack pack
    imx6 android4.2 编译
    repo 安装
    repo manifest.xml 分析
    ElasticSearch 5.0.0 安装部署常见错误或问题
    elasticsearch 安装(基于java运行环境)
  • 原文地址:https://www.cnblogs.com/gl-developer/p/6438311.html
Copyright © 2011-2022 走看看