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