程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 劍指offer編程題Java實現——面試題5從頭到尾打印鏈表

劍指offer編程題Java實現——面試題5從頭到尾打印鏈表

編輯:關於JAVA

劍指offer編程題Java實現——面試題5從頭到尾打印鏈表。本站提示廣大學習愛好者:(劍指offer編程題Java實現——面試題5從頭到尾打印鏈表)文章只能為提供參考,不一定能成為您想要的結果。以下是劍指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 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved