从宏观角度理解,假设除了head节点以外的其他节点已经反转好了。
接下来只要将头节点next指向自己,头节点指向null即可
public ListNode reverseList(ListNode head) {
if(head == null || head.next ==null){
return head;
}
ListNode rest = reverseList(head.next);
head.next.next = head;
head.next =null;
return rest;
}
接下来想研究下递归到底咋执行的,所以在代码中做下输出
public ListNode reverseList(ListNode head) {
System.out.println("当前head值: "+head.val);
if(head == null || head.next ==null){
return head;
}
System.out.println("前前前前前前前前前前前前前前");
ListNode rest = reverseList(head.next);
System.out.println("开始反转了:"+head.val+"和"+head.next.val);
head.next.next = head;
head.next =null;
return rest;
}
由以上输出可以推测出执行顺序
为啥递归会这样执行?
首先了解下递归的定义
- 一般来说,递归需要有边界条件、递归前进段和递归返回段。
- 当边界条件满足时,递归返回;当递归条件不满足时,递归前进;
- 递归的目的通常是把一个大型复杂的问题层层转化为一个与原问题相似的规-模较小的问题来求解
递归的通俗理解
- 递归类似于我们思考的过程,比如我们想了解为什么苹果会落地,然后发现是万有引力,然后就想弄明白为什么会有万有引力,然后查到是因为时空的扭曲…
递归和栈
当满足条件时,入栈
reverseList(4) |
---|
reverseList(3) |
reverseList(2) |
reverseList(1) |
当不满足条件时,出栈
依次执行 reverseList(4),reverseList(3),reverseList(2),reverseList(1)