题目描述:输入一个链表的头结点,从尾到头反过来打印出每个结点的值.
思路:借助栈实现,或使用递归的方法。
时间复杂度:O(n),空间复杂度:O(n)
解法一:使用栈(Stack)来实现
package Problem5;
3 import java.util.Stack;
5 //首先定义链表结构
6 class LinkNode{
7 LinkNode next;
8 int node_value;
9 }
11 public class PrintListReverse {
12 public void reverse(LinkNode headNode){
13 //用栈的思想来实现链表的倒序输出
14 Stack<LinkNode> stack=new Stack<LinkNode>();
15 while(headNode!=null){
16 stack.push(headNode);
17 headNode=headNode.next;
18 }
19 while(!stack.isEmpty()){
20 System.out.print(stack.pop().node_value+" ");
21 }
22 System.out.println();
23 }
25 /**
26 * @param args
27 */
28 public static void main(String[] args) {
29 //输入的链表有多个结点
30 PrintListReverse plr=new PrintListReverse();
31 LinkNode node1=new LinkNode();
32 LinkNode node2=new LinkNode();
33 LinkNode node3=new LinkNode();
34 node1.node_value=1;
35 node2.node_value=2;
36 node3.node_value=3;
37 node1.next=node2;
38 node2.next=node3;
39 plr.reverse(node1);
40 }
42 }
解法二:使用栈(Stack)和List集合(ArrayList)来实现
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>(); //创建数组集合来接收倒序的链表元素
if (listNode == null)
return list;
Stack<ListNode> stack = new Stack<>();
while (listNode != null) {
stack.push(listNode);
listNode = listNode.next;
}
while (!stack.isEmpty()) {
list.add(stack.pop().val);
}
return list; //返回倒序的链表元素的集合
}
解法三:使用递归来实现
public static void printList2(ListNode head){
if(head == null)
return;
if(head.next != null)
printList2(head.next);
System.out.print(head.val+" ");
}
注意:当链表很长的时候用递归可能会栈溢出,所以还是使用栈的方法鲁棒性更好