剑指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 }

浙公网安备 33010602011771号