一 **堆栈(Stack)(先进后出)(队列 先进先出)**
(java堆栈Stack和堆Heap的详解可参考链接:https://www.cnblogs.com/SunDexu/p/3140790.html)
栈是一种线形集合,其添加和删除元素的操作应在同一端尾部完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素。
Stack继承自Vector,底层是通过数组实现的。
Stack类有五个操作:
empty(),测试此堆栈是否为空。
peek(),查看此堆栈顶部的对象,而不从堆栈中删除它。
pop(),删除此堆栈顶部的对象,并将该对象作为此函数的值返回。
push(E item),将项目推送到此堆栈的顶部。
search(object o),返回一个对象在此堆栈上的基于1的位置。
存取数据的push()方法就像将子弹装入弹夹的的过程,先装的子弹在最底下,后装入的子弹总是在顶上,而pop()方法就是开枪子弹发射,最后存入的子弹,最先射出来。
实列:从尾到头打印链表(利用堆栈)
ListNode类代码见上一篇文章
package cn.itcast.test3;
/*
方法一:使用ArrayList实现 从尾到头输出一个链表
*/
import java.util.ArrayList;
import java.util.Stack;
public class StackTest {
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);
Solution1 solution1=new Solution1();
solution1.printListFromTailToHead(head);
}
}
class Solution1 {
public void printListFromTailToHead(ListNode listNode) {
Stack st=new Stack();
while(listNode!=null){
st.push(listNode.val);
listNode=listNode.next;
}
while(!st.isEmpty()){
System.out.println(st.pop());
}
}
}
二 递归
栈的本质也是递归,所以也可以利用递归来从尾到头打印链表。
代码如下:
public class RecursionTest {
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);
Solution3 solution3=new Solution3();
solution3.printListFromTailToHead(head);
}
}
class Solution3{
public void printListFromTailToHead(ListNode listNode){
if(listNode!=null){
if(listNode.next!=null){
printListFromTailToHead(listNode.next);
}
}
System.out.println(listNode.val);
}
}
三 指针反转
使从左往右指向的链表变成从右往左指向
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);
ListNode n3=new ListNode(4);
head.setNext(n1);
n1.setNext(n2);
n2.setNext(n3);
Solution solution=new Solution();
solution.printListFromTailToHead(head);
}
}
class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList al=new ArrayList();
ListNode next=null;
ListNode pre=null;
while(listNode!=null){
next=listNode.next;
listNode.next=pre;
pre=listNode;
listNode=next;
}
while(pre!=null){
al.add(pre.val);
System.out.println(pre.val);
pre=pre.next;
}
return al;
}
}
参考文章:https://blog.csdn.net/weixin_39795049/article/details/85832150