一:程序主题
1.题目
输入一个链表,从尾到头打印链表每个节点的值。
2.思路
/*
* 输入一个链表的头结点,从尾到头打印出每个结点的值 * 解决方案一:首先遍历链表的节点后打印,典型的“后进先出”,可以使用栈来实现这种顺序。 * 解决方案二:栈的本质就是递归,直接使用递归的方式,打印一个节点的时候先打印它后面的节点,再打印该节点自身,实现反向打印 * 解决方案三:遍历链表,把链表中的元素复制到ArrayList中,然后逆序打印ArrayList中的元素 * 解决方案四:前三种解决方案本身属于在打印链表的时候不修改链表本身结构, * 在允许修改链表结构的情况下可以把链表中的节点指针反转过来,改变链表方向,然后重新遍历打印改变方向后的链表,这种方式就不写了
*/
二:程序
1.ListNode类
1 package com.jianke.it; 2 /** 3 * 节点类 4 * @author dell 5 * 6 */ 7 public class ListNode { 8 int val; 9 ListNode next = null; 10 public ListNode() {} 11 public ListNode(int val) { 12 this.val = val; 13 } 14 }
2.方案二
递归
1 package com.jianke.it; 2 3 import java.util.ArrayList; 4 5 public class PrintListFromTailToHead { 6 7 /** 8 * 返回node 9 */ 10 static ArrayList<Integer> arrayList=new ArrayList<Integer>(); 11 public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) { 12 if(listNode!=null){ 13 printListFromTailToHead(listNode.next); 14 arrayList.add(listNode.val); 15 } 16 return arrayList; 17 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(1); 26 ListNode node7=new ListNode(); 27 node1.next=node2; 28 node2.next=node3; 29 node3.next=node4; 30 ArrayList list1=printListFromTailToHead(node1); 31 printInfo(list1); 32 // ArrayList list2=printListFromTailToHead(node5); 33 // printInfo(list2); 34 // ArrayList list3=printListFromTailToHead(node6); 35 // printInfo(list3); 36 // ArrayList list4=printListFromTailToHead(node7); 37 // printInfo(list4); 38 39 40 } 41 public static void printInfo(ArrayList list) { 42 for(int i=0;i<list.size();i++) { 43 System.out.print(list.get(i)+" "); 44 } 45 System.out.println(""); 46 } 47 48 }
3.方案一
使用栈
1 package com.jianke.it; 2 3 import java.util.ArrayList; 4 import java.util.Stack; 5 6 public class PrintListFromTailToHead { 7 8 /** 9 * 返回node 10 */ 11 static ArrayList<Integer> arrayList=new ArrayList<Integer>(); 12 public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) { 13 Stack<Integer> stack=new Stack<Integer>(); 14 while(listNode!=null){ 15 stack.push(listNode.val); 16 listNode=listNode.next; 17 } 18 while(!stack.isEmpty()){ 19 arrayList.add(stack.pop()); 20 } 21 return arrayList; 22 23 } 24 public static void main(String[] args) { 25 ListNode node1=new ListNode(1); 26 ListNode node2=new ListNode(2); 27 ListNode node3=new ListNode(3); 28 ListNode node4=new ListNode(4); 29 ListNode node5=null; 30 ListNode node6=new ListNode(1); 31 ListNode node7=new ListNode(); 32 node1.next=node2; 33 node2.next=node3; 34 node3.next=node4; 35 ArrayList list1=printListFromTailToHead(node1); 36 printInfo(list1); 37 38 } 39 public static void printInfo(ArrayList list) { 40 for(int i=0;i<list.size();i++) { 41 System.out.print(list.get(i)+" "); 42 } 43 System.out.println(""); 44 } 45 46 }
4.方案三
使用ArrayList逆序打印链表
1 package com.jianke.it; 2 3 import java.util.ArrayList; 4 import java.util.Stack; 5 6 public class PrintListFromTailToHead { 7 8 /** 9 * 返回node 10 */ 11 static ArrayList<Integer> arrayList=new ArrayList<Integer>(); 12 public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) { 13 ArrayList<Integer> arrayList2=new ArrayList<Integer>(); 14 while(listNode!=null){ 15 arrayList.add(listNode.val); 16 listNode=listNode.next; 17 } 18 for(int i=arrayList.size()-1;i>=0;i--){ 19 arrayList2.add(arrayList.get(i)); 20 } 21 return arrayList2; 22 23 } 24 public static void main(String[] args) { 25 ListNode node1=new ListNode(1); 26 ListNode node2=new ListNode(2); 27 ListNode node3=new ListNode(3); 28 ListNode node4=new ListNode(4); 29 ListNode node5=null; 30 ListNode node6=new ListNode(1); 31 ListNode node7=new ListNode(); 32 node1.next=node2; 33 node2.next=node3; 34 node3.next=node4; 35 ArrayList list1=printListFromTailToHead(node1); 36 printInfo(list1); 37 38 } 39 public static void printInfo(ArrayList list) { 40 for(int i=0;i<list.size();i++) { 41 System.out.print(list.get(i)+" "); 42 } 43 System.out.println(""); 44 } 45 46 }