三种思路
从尾到头打印链表
http://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035
1. 前后替换,类似于冒泡排序的核心理念 public static ArrayList returnList(ListNode listNode) { ArrayList list = new ArrayList<Integer>(); //新建一个前节点,赋值为null ListNode previous = null; ListNode curr = listNode; //遍历链表 while (curr != null) { //需要转换next节点为他的上一个节点,把当前节点转换成他的下一个节点,因此需要一个中间值保存它的next节点 ListNode temp = curr.next; //把他的上一个节点放到它下一个节点的位置 curr.next = previous; //转换位置,当前是next节点的备用,把当前节点放到它的前节点 previous = curr; //curr节点此时变成了前节点,把curr的next节点放到前面 curr = temp; } //遍历完之后,链表已经实现反转,再次遍历,之前的头节点变成了尾节点,因此需要放入previous for (; previous != null; previous = previous.next){ list.add(previous.val); } return list; } 2. 利用栈解决问题,先进后出 public static ArrayList returnList(ListNode listNode) { //新建一个数组 List<Integer> list = new ArrayList<>(); //新建一个栈 Stack<Integer> stack = new Stack<>(); //遍历链表,将链表中的值压入栈,add()和push()都可以 for(;listNode != null; listNode = listNode.next){ stack.push(listNode.val); } //从栈中依次取出数据并放入list for(;!stack.empty();){ list.add(stack.pop()); } /* 1.stream遍历 List<Integer> collect = stack.stream().map(index -> stack.get(stack.size() - 1 - index)).collect(Collectors.toList()); 2.List遍历,stack底层也是数组; int i = stack.size() - 1; for(;i >=0; size--){ list.add(stack.get(i)); }*/ return list; } 3.ArrayList.add(0,Object)方***将数据插入数组第一个位置 public static ArrayList returnList(ListNode listNode) { //NEW一个ArrayList ArrayList<Integer> list = new ArrayList<>(); //遍历链表 for(;listNode != null;listNode = listNode.next) { list.add(0, listNode.val); } return list; }