链表--反转链表(leetcode 206

递归解法

递归的三大步骤:Base case + 拆解 + 组合

BaseCase

注意递归的终止条件一定要写对

if(node == null || node.next == null) {
  return node;
}

拆解

递归的拆解就是把大问题,分解成小一点点的问题,直到 base case 可以返回,进行第三步的组合。

组合

组合的意思是,假设我们能够拿到小问题的解,那么用小问题的解去构造大问题的解。

这里很明显,在 2 后面接上 1 就行了。

但是怎么拿到 2 呢?

别忘了,原问题里,此时还有 1 指向 2 呢~

也就是 node1.next = node2,

然后把 2 指向 1:node2.next = node1

合起来就是:node1.next.next = node1

思路清楚就不绕,看着觉得绕的就是没想清楚哼~

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null) {
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
}

时空间复杂度都是o(n)


迭代方法省略不写

posted @ 2020-06-28 10:08  swifthao  阅读(128)  评论(0)    收藏  举报
Live2D