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;

 }