输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
方法一:①遍历链表得到节点数,然后创建数组
②从头到尾遍历链表,从尾到头赋值数组
时间复杂度o(n)
空间复杂度o(n)
package exercise04;
//输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
public class Solution {
public static void main(String[] args) {
// ListNode node = new ListNode(-1);
// ListNode node1 = new ListNode(5);
// ListNode node2 = new ListNode(4);
// ListNode node3 = new ListNode(3);
// ListNode node4 = new ListNode(2);
// ListNode node5 = new ListNode(1);
// node.next = node1;
// node1.next = node2;
// node2.next = node3;
// node3.next = node4;
// node4.next = node5;
// for (int i : reversePrint(node)) {
// System.out.println(i);
// }
for (int i : reversePrint(null)) {
System.out.println(i);
}
}
public static int[] reversePrint(ListNode head) {
if (head == null){
return new int[]{};
}
ListNode temp = head;
int size = 1;
while (temp.next != null){
size++;
temp = temp.next;
}
int[] arr = new int[size];
temp = head;
while (size > 0){
arr[size - 1] = temp.val;
temp = temp.next;
size--;
}
return arr;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
方法二:①利用栈“后进先出特点”,从头遍历链表时,一边遍历一边压栈
②根据栈大小创建数组,从索引0开始一边弹栈一边给数组赋值
时间复杂度o(n)
空间复杂度o(n)
不过,在力扣上测出来的数据没有第一个好
package exercise04;
import java.util.Stack;
//输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
public class Solution {
public static void main(String[] args) {
ListNode node = new ListNode(-1);
ListNode node1 = new ListNode(5);
ListNode node2 = new ListNode(4);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(2);
ListNode node5 = new ListNode(1);
node.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
for (int i : reversePrint(node)) {
System.out.println(i);
}
// for (int i : reversePrint(null)) {
// System.out.println(i);
// }
}
public static int[] reversePrint(ListNode head) {
if (head == null){
return new int[]{};
}
Stack<Integer> stack = new Stack<>();
ListNode temp = head;
while (temp != null){
stack.push(temp.val);
temp =temp.next;
}
int size = stack.size();
int[] arr = new int[size];
for (int i = 0;i < size;i++){
arr[i] = stack.pop();
}
return arr;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
方法三:递归(垃圾表达能力,看代码)(我最讨厌递归,总是想不明白,即使写出来了,也觉得不够清晰,标记一下,以后可能再看)
①走到链表最后一层,并利用此节点位置创建数组
②回溯每一层,都将该层节点数值倒序赋值给该层位置数组
class Solution {
private static int size;
public int[] reversePrint(ListNode head) {
return traverse(head, 0);
}
public static int[] traverse(ListNode node,int index){
if (node == null){
int[] arr = new int[index];
size = index;
return arr;
}
int[] arr = traverse(node.next, ++index);
arr[size-index] = node.val;
return arr;
}
}