有三种思路,
第一就是利用栈先入后出的特性完成,
第二就是存下来而后进行数组翻转。
第三是利用递归。
// 数组反转实现方式java
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能够理解成前一个节点地址,插入顺序:node
一、头节点传入,开始建立A数据,头节点的next指向A数据的内存地址,A节点的next替换成头节点的数组
二、头节点再传入,建立B数据,头节点的next又换成了指向B的内存地址,B节点的next替换头节点的A;this
总结一下:插入时候,一直在头节点的上面插入数据,原来的数据被“顶”上去了;spa
头插法遍历的时候,头节点开始,一个一个往上遍历。这样最后插入的就做为第一个输出出来了;.net
尾插法编练插入,比较好理解,就是一直在“尾巴”追加,遍历时候从头开始,第一个插入的就第一个输出出来; 指针
public class Test { static Node headNode; class Node { private Node next;//指针 private int data;//数据域 } //尾插法建立单链表 队列形式先进先出 public void back(Node node, int data) { if (data < 10) { Node next = new Node(); next.data = data; next.next = null; node.next = next; back(next, ++data); } } //头插法建立单链表 栈形式先进后出 public void head(Node node, int data) { if (data < 10) { Node next = new Node(); next.next = node.next; next.data = data; node.next = next; System.out.println("递归参数:" + node.data); head(node, ++data); } } public static void main(String[] args) { Test test = new Test(); headNode = test.new Node();//头指针// new Test().back(headNode, 0);//前插法 new Test().head(headNode, 0);//后插法 System.out.println("建立后的链表是:");//0 1 2 3 4 5 6 7 8 9 10 while (headNode.next != null) { headNode = headNode.next; System.out.print(headNode.data + " "); } }}//————————————————//版权声明:本文为CSDN博主「另外一个绝影」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。//原文连接:https://blog.csdn.net/weixin_37817685/article/details/83305972