正如书里所说,LinkedList 和 Tree 结构都是非常经典的recursive data structure。这也就决定了他们很多operation都可以用recursion来完成。这里头我们先去探讨Linked list以及关于它的一道非常经典的问题。
Reverse a linked list.
Example
For linked list 1->2->3, the reversed linked list is 3->2->1
iterative solution
recursive solution
这里头我还是想探讨recursion的四步法:
先去思考这个recursion方法的定义:那就是把reverse以当前head开头的linked list
然后思考如何把N的问题变换为N-1的问题:这里头因为linked list的recursive structure,我们可以很自然的想到把它split成head和head.next开头的linked list
再去assume N- 1的问题已经被黑盒解决了,我们如果用它返回的结果解决N的问题
根据extreme approach的方向来判断base case(是1还是N,是head还是tail)
这里头最重要的code就是如果transition N-1到N,也就是第三步。如果我们assume N-1的linked list已经被reverse,那么我们只要把原来的head append到结尾就好了,但是现在我们丢失了新的head的信息,因为我们return的是新的tail。所以这就引入了我们需要每次记录两个值来作为return type,new head和new tail。
public ListNode reverse(ListNode head) {
// write your code here
if (head == null){
return head;
}
return helper(head)[0];
}
public ListNode[] helper(ListNode head){
if (head.next == null){
//new head, new tail
return new ListNode[]{head, head};
}
ListNode[] newPair = helper(head.next);
newPair[1].next = head;
head.next = null;
return new ListNode[]{newPair[0], head};
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。