题目
剑指offer06:从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例1:
1 2
| 输入:head = [1,3,2] 输出:[2,3,1]
|
代码
方案1:递归法
先走至链表尾端,回溯时依次将节点值加入列表,然后将列表转为数组即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
class Solution { ArrayList<Integer> tmp = new ArrayList<>(); public int[] reversePrint(ListNode head) {
recur(head); int[] res = new int[tmp.size()];
for(int i=0;i<res.length;i++){ res[i] = tmp.get(i); } return res; } public void recur(ListNode head){ if(head == null) return; recur(head.next); tmp.add(head.val); }
}
|
方案2:辅助栈法
利用栈后进先出的特性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
class Solution { public int[] reversePrint(ListNode head) { Stack<Integer> stack = new Stack<>(); while(head != null) { stack.push(head.val); head = head.next; } int[] res = new int[stack.size()]; for(int i = 0; i < res.length; i++) res[i] = stack.pop(); return res; } }
|
随笔
定义单链表
1 2 3 4 5
| public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public static void main(String[] args) { ListNode head = new ListNode(1); ListNode firstNode = new ListNode(3); ListNode secondNode = new ListNode(2);
head.next = firstNode; firstNode.next = secondNode;
int[] res = reversePrint(head);
System.out.print("[" ); for(int i=0;i<res.length;i++){ if(i==res.length-1) { System.out.print(res[i]); }else { System.out.print(res[i]+","); } } System.out.print("]" );
}
|
递归
传递+回归
列表
1、列表的定义
1
| ArrayList<Integer> tmp = new ArrayList<>();
|
2、列表常见的方法
(1)size()
列表的长度。
示例:
(2)get()
根据索引获取列表中的元素值。
示例: