剑指offer(5)——从尾到头打印链表

2019-09-11 17:22:41 浏览数 (1)

题目:

输入一个链表的头结点,从尾到头反过来打印出每个结点的值。结点定义如下: public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }

思路:

  • 从尾到头,我们首先想到的就是栈这个结构,栈是先进先出的结构,先进来的元素最后再出去,所以本题我们可以考虑用栈来解决
  • 想到栈的同时我们也应该联想到递归

代码:

代码语言:javascript复制
 1 import java.util.Stack;
 2 
 3 import org.junit.jupiter.api.Test;
 4 
 5 /**
 6  *   反向打印链表
 7  * @author wydream
 8  *
 9  */
10 
11 public class PrintList {
12 
13     class ListNode{
14         Object key;
15         ListNode next;
16         public ListNode(Object key) {
17             this.key=key;
18             this.next=null;
19         }
20     }
21     
22     //采用栈
23     public void printListRever(ListNode node) {
24         Stack<ListNode> stack=new Stack<ListNode>();
25         while(node!=null) {
26             stack.push(node);
27             node=node.next;
28         }
29         while(!stack.empty()) {
30             System.out.println(stack.pop().key);
31         }
32     }
33     
34     //采用递归
35     public void printListReverdg(ListNode node) {
36         if(node!=null) {
37             printListReverdg(node.next);
38             System.out.println(node.key);
39         }else {
40             return;
41         }
42     }
43     
44     
45     //=============测试代码=============
46     @Test
47     public void test() {
48         ListNode ListNode1 = new ListNode(1);
49         ListNode ListNode2 = new ListNode(2);
50         ListNode ListNode3 = new ListNode(3);
51         ListNode ListNode4 = new ListNode(4);
52         ListNode ListNode5 = new ListNode(5);
53         ListNode1.next=ListNode2;
54         ListNode2.next=ListNode3;
55         ListNode3.next=ListNode4;
56         ListNode4.next=ListNode5;
57         System.out.println("采用栈:");
58         printListRever(ListNode1);
59         System.out.println("采用递归:");
60         printListReverdg(ListNode1);
61     }
62     
63     
64 }

0 人点赞