Linked list 和 Recursion

正如书里所说,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};
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值