复习算法,15天内刷完剑指Offer
那么多学技术的都可以成功,凭什么我不行?
目录
1、题目
输入一个链表的头结点,从尾到头反过来打印出每个结点的值。结点定义如下:
class Node {
int val;
Node next = null;
public Node(int val) {
this.val = val;
}
}
2、解题思路
首先可以想到链表反转,但是链表反转会改变原数组的结构。不推荐。本次介绍不反转的方式。
结点遍历顺序只能从头到尾,但是输出的顺序却为从尾到头,是典型的“后进先出”问题,这就要联想到使用栈,从而也可以联想到使用递归。
3、代码实现
解法1
/*采用栈的方式*/
public void printListReversingly_Iteratively(Node node) {
Stack<Node> nodeStack = new Stack<>();
while (node != null) {
nodeStack.push(node);
node = node.next;
}
while (!nodeStack.empty()) {
System.out.println(nodeStack.pop().val);
}
}
解法2
/*采用递归的方式*/
public void printListReversingly_Recursively(Node node) {
if (node != null) {
printListReversingly_Recursively(node.next);
System.out.println(node.val);
} else {
return;
}
}
递归的另一种写法
/*递归第二种写法*/
public void printListReversingly_Recursively2(Node node) {
if (node != null) {
if (node.next != null) {
printListReversingly_Recursively2(node.next);
}
System.out.println(node.val);
}
}
收获
1.对于“后进先出”问题,要快速想到”栈“,也同时想到递归。
2.采用递归时,返回的函数值不一定要有赋值操作,只要实现了遍历的作用就可以了,上面牛客网的代码可以多多学习。