题目1、输入一个链表,从尾到头打印链表每个节点的值
(Java版本) 从尾到头遵循“先进后出原则”,所以首先考虑使用栈
思路一:栈思想,我们先遍历链表,遍历到一个节点就将其压入栈,直到所有节点都入栈,利用栈“先进后出的特点”,进行栈元素出站操作(首先是弹出栈顶节点 即,最后一个被压入栈的节点)并打印节点的值,直到栈为空
package com.murphy.datastructure;
import java.util.Stack;
import java.util.ArrayList;
/**
* 使用栈的递归思想
* */
//首先定义一个list节点类
class ListNode {
int val;
ListNode next = null;
//定义构造方法
ListNode(int val) {
this.val = val;
}
}
//定义入口主函数以及实现方法
public class printList {
//入口函数
public static void main(String[] args) {
//此处定义多个list节点,并给定初始值
ListNode l1 = new ListNode(1);
ListNode l2 = new ListNode(2);
ListNode l3 = new ListNode(3);
l1.next = l2;
l2.next = l3;
l3.next = null;
ArrayList<Integer> al = printList.printListFromTailToHead(l1); //使用静态方法类名调用
al.forEach(item ->{
System.out.println(String.valueOf(item));
});
}
//实现方法
public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {//传入参数
//创建栈对象
Stack<Integer> stack = new Stack<>();
while (listNode != null) {//传入的节点不为空
stack.push(listNode.val); //push方法,将节点压入栈
listNode = listNode.next;
//循环内打印的话每循环一次都要打印一次
}
// System.out.println("节点压入栈的结果:"+stack.toString()); //测试结果:while循环外打印入栈的结果[1,2,3]
ArrayList<Integer> list = new ArrayList<>();
while (!stack.isEmpty()) {//栈不为空
list.add(stack.pop()); //调用pop方法,栈元素循环出栈(先弹出栈顶元素),结果存入动态数组中
}
// System.out.println("list结果:"+list.toString());//测试结果
return list;
}
}
思路二、栈思想变形:也是类似于递归的思想(本质上是栈结构),该方法内部不断调用其本身(最简洁的代码)
package com.murphy.datastructure;
/**
* 方法二:类似于递归思想,利用方法内部不断调用其本身的原理
* */
import java.util.ArrayList;
public class printList2 {
public static void main(String[] args){
//创建节点类对象,并给定初始值
ListNode l1=new ListNode(1);
ListNode l2=new ListNode(2);
ListNode l3=new ListNode(3);
l1.next=l2;
l2.next=l3;
l3.next=null;
Solution sol=new Solution();
ArrayList<Integer> list = sol.printListFromTailToHead(l1);//
//java1.8版本新特性:lambda表达式
list.forEach(item->{
System.out.println(String.valueOf(item));
});
}
}
//定义解决方法
class Solution {
ArrayList<Integer> arrList = new ArrayList<Integer>();
//定义从尾到头打印结果方法
public ArrayList<Integer> printListFromTailToHead(ListNode ln) {
if(ln!=null){
//递归思想:自己调用自己
printListFromTailToHead(ln.next);//此处可以自己打印观察一下结果
arrList.add(ln.val);//添加到数组中
}
return arrList;
}
}
//定义节点类
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}