来看看实现翻转链表的第2种方法——递归法
这种方法更简洁一些,但是比较难于理解,可以借助下图:
Solution:
class Solution{
public ListNode reverseList(ListNode head){
if(head == null) || head->next == null) //如果最后一个结点不操作
return head;
ListNode node = reverseList(head->next); //先递归到最底层 然后返回 即一直循环到链尾
head->next->next = head; //翻转链表的指向
head->next = null; //记得赋值null 防止链表错乱
return node; //新链表头永远指向的是原链表的链尾
}
来看下过程:非递归(迭代)方式是从前面数1开始往后依次处理,而递归方式则恰恰相反,它先循环找到最后面指向的数5,然后从5开始处理依次翻转整个链表。
注意代码中的: ListNode node = reverseList(head->next); 就是这句话,表示递归到最后一个。
5在这里是最后一个数,翻转之后为头。因此我们设定一个指针node一直指向它。
然后head通过 递归式ListNode node = reverseList(head->next)指向了最后一个元素,如下图1:
这个时候执行 head->next->next = head做下图的处理,将head指向的地址赋值给head->next->next指针.这是head逐层返回的过程
继续返回 注意要有head->next = null这一步 否则找不到尾指针
继续返回 返回的过程就是更改指针 并将head一直指向null
结束。翻转成功