题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 答案有三种思路, 第一就是利用栈先入后出的特性完成, 第二就是存下来然后进行数组翻转。 第三是利用递归。
// 数组反转实现方式 ![]()
public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> list=new ArrayList<Integer>(); ListNode pre=null; ListNode next=null; while(listNode!=null){ next=listNode.next; listNode.next=pre; pre=listNode; listNode=next; } while(pre!=null){ list.add(pre.val); pre=pre.next; } return list; } } 链接:https://www./questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035?f=discussion 来源:牛客网 java 递归超简洁版本 public class Solution { ArrayList<Integer> arrayList= new ArrayList<Integer>(); public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { if (listNode!= null ){ this .printListFromTailToHead(listNode.next); arrayList.add(listNode.val); } return arrayList; } } 创建链表相关,头插法和尾插法
关于头插法,可以next可以理解成前一个节点地址,插入顺序: 1、头节点传入,开始创建A数据,头节点的next指向A数据的内存地址,A节点的next替换成头节点的 2、头节点再传入,创建B数据,头节点的next又换成了指向B的内存地址,B节点的next替换头节点的A; 总结一下:插入时候,一直在头节点的上面插入数据,原来的数据被“顶”上去了; 头插法遍历的时候,头节点开始,一个一个往上遍历。这样最后插入的就作为第一个输出出来了; 尾插法编练插入,比较好理解,就是一直在“尾巴”追加,遍历时候从头开始,第一个插入的就第一个输出出来; public class Test { |
|