从尾到头打印链表
1、参考资料
https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/
2、题目要求
题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例
输入:head = [1,3,2]
输出:[2,3,1]
3、基于栈的实现
3.1、代码思路
我们利用栈先进后出的原理,首先正向遍历链表中的每个节点,将其压入栈中,然后,将栈中的元素依次出栈并输出,即是链表的逆序输出
3.2、代码实现
-
代码
public class ReversePrintDemo { public static void main(String[] args) { SingleLinkedList singleLinkedList = new SingleLinkedList(); singleLinkedList.add(new Node(1)); singleLinkedList.add(new Node(2)); singleLinkedList.add(new Node(3)); singleLinkedList.add(new Node(4)); singleLinkedList.add(new Node(5)); singleLinkedList.add(new Node(6)); System.out.println("顺序输出~~~"); singleLinkedList.show(); System.out.println("反向输出~~~"); singleLinkedList.reversePrint(); } } //链表类 class SingleLinkedList { private Node head = new Node(0); public void add(Node node) { // 首节点指针不能移动哦,需要定义辅助指针 Node preNode = head; while (preNode.next != null) { preNode = preNode.next; } preNode.next = node; } public void show() { // 首节点指针不能移动哦,需要定义辅助指针 Node curNode = head.next; while (curNode != null) { System.out.print(curNode.data + "-->"); curNode = curNode.next; } System.out.println(); } public void reversePrint() { Stack<Node> stack = new Stack<Node>(); Node curNode = head.next; // 顺时针遍历链表,将其添加至栈中 while (curNode != null) { stack.add(curNode); curNode = curNode.next; } // 栈中元素依次出栈 while (stack.isEmpty() == false) { System.out.print(stack.pop() + "-->"); } } } //节点 class Node { public Integer data; public Node next; public Node(Integer data) { this.data = data; } public String toString() { return data.toString(); } }
-
程序运行结果
顺序输出~~~ 1-->2-->3-->4-->5-->6--> 反向输出~~~ 6-->5-->4-->3-->2-->1-->
4、基于递归的实现
4.1、代码思路
递归的思路就是:遍历当前节点时,先判断当前节点有没有下一个节点,如果有下一个节点,则先输出下一个节点,再输出当前节点,这样即可逆序输出链表
4.2、代码实现
-
代码
public class RecursionReversePrintDemo { public static void main(String[] args) { SingleLinkedList singleLinkedList = new SingleLinkedList(); singleLinkedList.add(new Node(1)); singleLinkedList.add(new Node(2)); singleLinkedList.add(new Node(3)); singleLinkedList.add(new Node(4)); singleLinkedList.add(new Node(5)); singleLinkedList.add(new Node(6)); System.out.println("顺序输出~~~"); singleLinkedList.show(); System.out.println("反向输出~~~"); singleLinkedList.reversePrint(); } } //链表类 class SingleLinkedList { private Node head = new Node(0); public void add(Node node) { // 首节点指针不能移动哦,需要定义辅助指针 Node preNode = head; while (preNode.next != null) { preNode = preNode.next; } preNode.next = node; } public void show() { // 首节点指针不能移动哦,需要定义辅助指针 Node curNode = head.next; while (curNode != null) { System.out.print(curNode.data + "-->"); curNode = curNode.next; } System.out.println(); } // 递归逆序打印链表 public void reversePrint() { reversePrint(head.next); // 起始位置为首节点 } // 递归逆序打印链表 public void reversePrint(Node node) { // 如果 node 还有下一个节点,则不能打印 node,需要先打印其下一个节点 if (node.next != null) { reversePrint(node.next); } // 打印完 node 的下一个节点之后,输出 node 节点本身 System.out.print(node + "-->"); } } //节点 class Node { public Integer data; public Node next; public Node(Integer data) { this.data = data; } public String toString() { return data.toString(); } }
-
程序运行结果
顺序输出~~~ 1-->2-->3-->4-->5-->6--> 反向输出~~~ 6-->5-->4-->3-->2-->1-->