从尾到头打印链表
从尾到头打印链表
题目链接
题目描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回) 。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
示例1
输入:
{1,2,3}
返回值:
[3,2,1]
示例1
输入:
{67,0,24,58}
返回值:
[58,24,0,67]
创建节点
节点里面只写了添加节点和打印节点两个方法
class LinkedNode{
private int val;
private LinkedNode next;
public LinkedNode() {
}
public LinkedNode(int val) {
this.val = val;
}
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
public LinkedNode getNext() {
return next;
}
public void setNext(LinkedNode next) {
this.next = next;
}
/**
创建节点
*/
public void add(int val) {
LinkedNode node = new LinkedNode(val);
if(this.next == null) {
this.next = node;
}else {
this.next.add(val);
}
}
/**
* 输出链表
*/
public void print() {
System.out.print(this.val);
if(this.next != null) {
System.out.print("-->");
this.next.print();
}
}
}
解法
第一种
第一种解法使用的是栈的特点,栈具有先进后出的功能
public static List<Integer> printNodeFromTailToHead(LinkedNode node) {
Stack<Integer> stack = new Stack<>();
//往栈中添加节点
while (node != null) {
stack.add(node.getVal());
node = node.getNext();
}
List<Integer> list = new ArrayList<>();
//从栈中取出节点添加到集合中
while (!stack.isEmpty()) {
list.add(stack.pop());
}
return list;
}
第二种
使用集合类中的add(index,value)方法,根据索引位置插入元素,如果该位置有元素,该位置的元素就要往后移
public static List<Integer> printNodeFromTailToHead2(LinkedNode node) {
ArrayList<Integer> list = new ArrayList<>();
while (node != null) {
list.add(0,node.getVal());
//把下个节点赋值给当前节点重新判断
node = node.getNext();
}
return list;
}
第三种
使用递归的方式 不能把集合放在方法里面,不然每次递归都会初始化的
static ArrayList<Integer> list = new ArrayList();
public static List<Integer> printNodeFromTailToHead3(LinkedNode node) {
if(node != null){
printNodeFromTailToHead3(node.getNext());
list.add(node.getVal());
}
return list;
}
验证
public static void main(String[] args) {
LinkedNode node = new LinkedNode();
node.add(1);
node.add(2);
node.add(3);
node.print();
System.out.println();
//List<Integer> list = printNodeFromTailToHead(node);
//System.out.println(list);
//List<Integer> list = printNodeFromTailToHead2(node);
//System.out.println(list);
List<Integer> list = printNodeFromTailToHead3(node);
System.out.println(list);
}