需求:
给定一个链表的头部节点,从尾到头依次输出所有的节点值
分析:
1、思路一
比较容易想到的是,遍历链表,将节点值存到集合中,然后反向输出
2、思路二
一般是从前向后遍历链表,但此处要求反向输出,可以想到先进后出的数据结构是栈,因此可以创建栈,然后将节点值依次存到栈中,然后依次pop()
代码:
import java.util.*;
//节点类
class Node{
int val;//节点值
Node next;//节点的下一个节点
Node(int val){
this.val = val;
next = null;
}
}
class PrintList{
//创建链表,返回头节点
//输入整型数组,作为所有节点的值
public static Node getHead(int[] arr){
//创建集合,存储所有的节点
List<Node> list = new ArrayList<Node>();
//遍历数组
for(int i = 0; i < arr.length; i++){
list.add(new Node(arr[i]));
}
//将各个节点之间的关系联系起来
for(int i = 0; i < arr.length-1; i++){
list.get(i).next = list.get(i+1);
}
return list.get(0);//返回头节点
}
//正向输出链表
public static void printList(Node head){
if(head == null){
return ;
}
while(head != null){
System.out.print(head.val+" -> ");
head = head.next;
}
System.out.println("null");
}
//反向输出链表
//思路一:使用集合
public static void reversePrintList1(Node head){
//思路一
if(head == null){
return ;
}
//创建List集合
List<Integer> list = new ArrayList<Integer>();
while(head != null){
list.add(head.val);
head = head.next;
}
Collections.reverse(list);//反转集合
for(Integer i : list){
System.out.print(i+" ");
}
System.out.println();
}
//反向输出链表
//思路二:使用栈
public static void reversePrintList2(Node head){
if(head == null){
return ;
}
//创建栈,存储节点值
Stack<Integer> stack = new Stack<Integer>();
while(head != null){
stack.push(head.val);
head = head.next;
}
//将栈顶依次弹出
/*
//这样遍历的结果是顺序输出
for(Integer i:stack){
System.out.println(i+" ");
}
*/
while(!stack.empty()){
System.out.print(stack.pop()+" ");
}
System.out.println();
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入长度:");
int[] arr = new int[scan.nextInt()];
System.out.println("请输入数组内容:");
for(int i = 0; i < arr.length; i++){
arr[i] = scan.nextInt();
}
System.out.println("您创建的链表为:");
printList(getHead(arr));
System.out.println("链表的反向输出为:");
reversePrintList1(getHead(arr));
reversePrintList2(getHead(arr));
}
}