剑指offer-面试题5-2 从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。
这是这道题目的第二种方法,第一种方法参见:剑指offer-面试题5-1 从尾到头打印链表。
思路:
第一种方法中的链表由于其结点是内部类,无法直接传递进入reverse()方法,我选择了直接传入整个链表,虽然也实现了题目效果,但仍不够严谨。
所以在第二种方法中用了一个简单的内部类Node,这样就可以满足题目要求。
第二种方法中还用到了递归,这个方法简单而且明了,是个不错的方法。
代码:
package swordOffer;
/**
* 这是剑指offer的第5题:
* 输入一个链表的头结点,从尾到头反过来打印出每个结点的值。
* @author Stephen Huge
*/
public class Ex05ReverseLinkList2 {
public static void main(String[] args) {
//内部类的实例化方式
Ex05ReverseLinkList2.Node a = new Ex05ReverseLinkList2().new Node("aaa");
Ex05ReverseLinkList2.Node b = new Ex05ReverseLinkList2().new Node("bbb");
Ex05ReverseLinkList2.Node c = new Ex05ReverseLinkList2().new Node("ccc");
a.next = b;
b.next = c;
c.next = null;
reverseLinkList2(a);
}
public static void reverseLinkList2(Node header) {
if(header.next != null) {
reverseLinkList2(header.next);
}
System.out.println(header.data.toString());
}
public class Node{
Node next;
Object data;
Node() {}
Node(Object data) {
this.data = data;
}
}
}
运行结果:
ccc
bbb
aaa
递归的核心就是两个,判断和重复调用。如果判断满足条件,就停止调用,这是递归方法的“刹车”,判断不满足条件就一直调用,直到满足条件为止。
这段代码的逻辑就是当链表结点的后继结点next !=null时递归调用原方法,直到next == null。其实这就是到达单链表尾结点的情况,之后打印尾结点的data值,然后方法执行完毕,返回上一层,打印尾结点的前驱结点,再返回上一层…最终打印所有结点的data值。我们成功的实现了链表的反转。