剑指offer_链表翻转输出

题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

 1 import java.util.ArrayList;
 2 import java.util.Collections;
 3 public class Solution {
 4     public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
 5         
 6         ArrayList<Integer> list =new ArrayList<>();
 7         if(listNode==null) return list;
 8         while(listNode.next!=null){
 9             list.add(listNode.val);
10             listNode=listNode.next;
11         }
12          list.add(listNode.val);
13         Collections.reverse(list);
14         return list;
15     }
16 }

这就是喜闻乐见的暴力法,先一个个输入到ArrayList里面然后再翻转一下即可。

再看看别的方法

第一个思路是使用递归,要逆序打印链表1->2->3 (3,2,1),可以先逆序打印链表2->3(3,2),最后再打印第一个节点。而链表2->3可以看成是一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。

 1 import java.util.ArrayList;
 2 public class Solution {
 3     public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
 4         
 5         ArrayList<Integer> list =new ArrayList<>();
 6         if(listNode!=null){
 7             list.addAll(printListFromTailToHead(listNode.next));
 8             list.add(listNode.val);
 9         }
10         return list;
11     }
12 }

第二个思路是使用头插法得到一个逆序链表

主要思想就是先建立一个head节点作为头节点,然后不断的插入head的后面,最终倒转了数据

 1 import java.util.ArrayList;
 2 public class Solution {
 3     public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
 4         
 5       
 6         ListNode head = new ListNode(-1);
 7         while(listNode!=null){
 8             ListNode memo = listNode.next;
 9             listNode.next=head.next;
10             head.next=listNode;
11             listNode=memo;
12         }
13         
14         ArrayList<Integer> list =new ArrayList<>();
15         head=head.next;
16         while(head!=null){
17             list.add(head.val);
18             head=head.next;
19         }
20         
21         return list;
22         
23         
24     }
25 }

 

第三个思路是使用栈

栈具有后进先出的特点,在遍历链表时,将值按顺序放入栈中最后出栈顺序即为逆序。

 1 import java.util.ArrayList;
 2 import java.util.Stack;
 3 public class Solution {
 4     public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
 5         ArrayList<Integer> list =new ArrayList<>();
 6         Stack<Integer> s= new Stack<>();
 7         while(listNode!=null){
 8             s.push(listNode.val);
 9             listNode=listNode.next;
10         }
11          
12         while(!s.isEmpty()){
13             list.add(s.pop());
14         }
15         return list;
16     }
17 }

 

posted @ 2019-08-10 19:53  chyblogs  阅读(145)  评论(0)    收藏  举报