递归虽然开销(主要是空间复杂度)比迭代大,但在很多棘手的问题上非用不可,能四两拔千斤、出奇制胜。
链表问题一般有好几种解法,递归有时就是其中最简洁明了的一种。我举几个例子,以嗜读者。
问题一:从尾到头反过来打印出每个结点的值
算法简要描述:
先将链表结点移动到尾部,然后边后移一个结点边输出本次指向结点的值。最后移动到头结点,便实现了反向打印,程序结束。
代码如下:
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> ret = new ArrayList<>();
if (listNode != null) {
ret.addAll(printListFromTailToHead(listNode.next));
ret.add(listNode.val);
}
return ret;
}
问题二:删除链表中重复的结点