使用递归算法实现链表反转
设计思路
使用递归方式翻转单向链表的核心是
- 递归的终止条件: 当前节点.next == null 终止,返回当前节点
- 递归一般规律:
- 每进入递归,传入当前节点的下个节点(cuurent.next) 来检测是否满足继续进入递归的条件,即传入的.next是否为null。
-tips: 其实这么做相当于传入当前节点的下个节点,当前节点为下一个节点的前节点,我们讲过,单链表反转的核心是记录前一个节点和后一个节点。此处以current为pre,传入current.next, 终止为current.next.next==null,返回current.next. - 如果终止,即终止条件,返回last节点= 递归函数(current.next);
- 当前(current).next.next = current;?? 看起来比较奇怪,实际上就是理解为:当前节点的下个节点连接当前节点,这不是翻转了吗
- 当前节点被连接之后,当前节点也要断开与之前节点的连接:current.next = null;
- 每进入递归,传入当前节点的下个节点(cuurent.next) 来检测是否满足继续进入递归的条件,即传入的.next是否为null。
大家可以看一下这个图来辅助理解:
参考代码
- 放入节点,检查下一个节点是否为null, 用来作为递归的跳出条件。即,找到最后一个节点完成递归过程,主播依次返回结果。
- 找到最终节点的前一个节点current,这个节点就是要放入递归方法的节点,因为我们放入递归方法的结构为reverse(current.next),可以参考图例中节点2。
- 将current.next.next = current, 即节点3连接节点2.
- 将当前节点2.next = null
public ListNode<Integer> reverseRecursion(ListNode<Integer> current){
//终止条件
//if(current.next == null) return current;
if(current.next == null) return current;
ListNode<Integer> last = reverseRecursion(current.next);
current.next.next= current;
current.next= null;
return last;
}