标题:剑指offer java版 test3—从尾到头打印链表
题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
解答:知识不够全面,用ArrayList做的 但是看到大佬们还可以用栈,递归,指针反转做,收益匪浅。链接:https://blog.csdn.net/weixin_39795049/article/details/85832150
写的很好。
基础知识介绍:
1,链表:链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针连接次序实现的。
链表由一系列的结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成,每个结点包括两个部分:一是存储数据元素的数据域,另一个时存储下一节点地址的指针域。链表不必须按照顺序存储,使用链表可以客服数组需要预先知道数据大小的特点,链表结构可以充分利用计算机内存空间。
2,Collection表示一组对象,它是集中,收集的意思,Collection接口的两个子接口是List和Set接口。List是有序(List中每个元素都有索引标记,可以根据元素的索引标记访问元素),可重复的容器。List接口常用的实现类有3个:ArrayList,LinkedList和Vector。
2.1 ArrayList底层是用数组实现的存储,所以它查询效率高,增删效率低,线程不安全。但和数组不一样的是,ArrayList是可以存放任意数量的对象,长度不受限制。
2.2 LinkedList的底层则是采用双向链表实现的存储,它的每个数据节点都有两个指针,分别指向前后一个节点和后一个节点。所以LinkedList查询效率低,增删效率高,线程不安全。
2.3 Vector底层使用数组实现的List,线程安全,效率低。
代码编写:(使用ArrayList方式从头到尾输出的代码如下)
part1:链表类如下:
package cn.itcast.test3;
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
public ListNode getNext() {
return next;
}
public void setNext(ListNode next) {
this.next = next;
}
}
part2:主函数代码如下:
package cn.itcast.test3;
/*
方法一:使用ArrayList实现 从尾到头输出一个链表
*/
import java.util.ArrayList;
class practice {
public static void main(String[] args){
ListNode head=new ListNode(1);
ListNode n1=new ListNode(2);
ListNode n2=new ListNode(3);
head.setNext(n1);
n1.setNext(n2);
Solution solution=new Solution();
solution.printListFromTailToHead(head);
}
}
class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList al=new ArrayList();
ArrayList al1=new ArrayList();
while(listNode!=null){
al.add(listNode.val);
listNode=listNode.next;
}
for(int i=al.size()-1;i>=0;i--){
al1.add(al.get(i));
System.out.println(al1.get(i));
}
return al1;
}
}