题目:
输入一个链表的头结点,从尾到头反过来打印出每个结点的值。结点定义如下: 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 }