题目描述:
输入一个链表,从尾到头打印链表每个节点的值。
题目解答:
刚开始竟然不知道在 java 中链表的基本操作。。。
总的来说,有两种方法可以解决:
法一:利用集合 Collections 中的 reverse() 方法实现集合的翻转
法二:想到先进后出的栈表操作,容易知道这是一个递归的操作
代码如下:
import java.util.*;
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class Solution {
static ListNode head = null;
static ListNode temp = null;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (input.hasNext()) {
while (input.hasNext()) {
addListNode(input.nextInt());
}
System.out.println("Solution1:");
for (int a : printListFromTailToHead1(head)) {
System.out.print(a + " ");
}
System.out.println();
System.out.println("Solution2:");
for (int a : printListFromTailToHead2(head)) {
System.out.print(a + " ");
}
}
input.close();
}
public static void addListNode(int val) {
ListNode n = new ListNode(val);
//初始化头结点
if (head == null) {
head = n;
return;
}
//保持头结点不动,用临时变量保存
temp = head;
//找到一个为空的节点,并赋值
while (temp.next != null) {
temp = temp.next;
}
temp.next = n;
}
//法一
public static ArrayList<Integer> printListFromTailToHead1(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<Integer>();
while (listNode != null) {
list.add(listNode.val);
listNode = listNode.next;
}
Collections.reverse(list);
return list;
}
//法二
static ArrayList<Integer> list = new ArrayList<Integer>();
public static ArrayList<Integer> printListFromTailToHead2(ListNode listNode) {
if (listNode != null) {
printListFromTailToHead2(listNode.next);
list.add(listNode.val);
}
return list;
}
}
运行结果:Input:
1 2 3 4 5
Output:
Solution1:
5 4 3 2 1
Solution2:
5 4 3 2 1