从尾到头打印链表
ArrayList 是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。
ArrayList数组的使用,通过添加和删除元素,就可以动态改变数组的长度。
数组队列:用数组实现的队列,也叫循环队列。就是定义一个数组,用两个下标front,rear表示队头和队尾。
当队头和队尾相等时,队列为空。当队尾+1等于队头时,队列为满。这样会浪费一个内存空间。还可以定义一个变量,表示队列空满。
Integer类是基本数据类型int的包装器类,是抽象类Number的子类,位于java.lang包中。
Integer是int的包装类,int则是java的一种基本数据类型。
Integer类在对象中包装了一个基本类型int的值,也就是每个Integer对象包含一个int类型的字段。
Integer变量必须实例化后才能使用,而int变量不需要。
Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。
Integer的默认值是null,int的默认值是0。
由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。
在节点ListNode定义中,定义为节点为结构变量。
节点存储了两个变量:value 和 next。value 是这个节点的值,next 是指向下一节点的指针,当 next为空指针时,这个节点是链表的最后一个节点。
堆栈是一种 “后进先出” (LIFO) 的数据结构, 只能在一端进行插入(称为 “压栈” ) 或删除 (称为“出栈”)数据的操作。
递归:一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。
//输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
import java.util.ArrayList;
import java.util.Stack;
public class LinkList2 {
public Node head;
public Node current;//成员变量 current 方便添加和遍历的操作,用来表示当前节点的索引
public static void main(String[] args) {
LinkList2 list = new LinkList2();//新建一个单链表
// 向LinkList2 中添加数据
for (int i = 0; i < 10; i++) {
list.add(i);// 向链表中添加数据
}
ArrayList<Integer> temp = printListFromTailToHead(list.head);// 调用方法
System.out.println(temp);//输出数组队列ArrayList
}
public static ArrayList<Integer> printListFromTailToHead(Node node) {
Stack<Integer> stack = new Stack<>();// 新建一个堆栈,利用其先进后出的特性
while (node != null) {
stack.push(node.data);// 进栈
node = node.next;
}
ArrayList<Integer> arraylist = new ArrayList<>();// 新建一个数组队列ArrayList,接收堆栈的数据
while (!stack.isEmpty()) {
arraylist.add(stack.pop());// 出栈
}
return arraylist;
}
// 方法:向链表中添加数据
public void add(int data) {
// 判断链表为空的时候
if (head == null) {// 如果头结点为空,说明这个链表还没有创建,那就把新的结点赋给头结点
head = new Node(data);
current = head;
} else {
// 创建新的结点,放在当前节点的后面(把新的结点和链表进行关联)
current.next = new Node(data);
// 把链表的当前索引向后移动一位
current = current.next; // 此步操作完成之后,current结点指向新添加的那个结点
}
}
/*
节点类Node是内部类;使用内部类的最大好处是可以和外部类进行私有操作的互相访问。
内部类访问的特点是:内部类可以直接访问外部类的成员,包括私有;外部类要访问内部类的成员,必须先创建对象。
*/
class Node {
// 注:此处的两个成员变量权限不能为private,因为private的权限是仅对本类访问。
int data; // 数据域
Node next;// 指针域
public Node(int data) {
this.data = data;
}
}
}