206. 反转链表
记录链表翻转算法总结,防止脑子今天会了 明年不会
常见的形式
1. 遍历next
2. 递归
递归的思想是 先找到尾节点,然后进行返回,当返回倒数第二个节点时,head.next.next=尾结点的下一个指向为当前节点,但现在是一个双向的状态,倒数第二个相互指向倒数第一个,这个时候需 将倒数第二个节点指向倒数第一个为null
总流程为:
判断当前节点是否为null 或者当前节点的下一个节点为null 排除特殊情况,就一个节点,没有next;
如果走到这一行,说明至少有两个节点,那么进行方法的递归,先获取最后的节点,
这个时候进行返回,
倒数一个参数由于next为null 所以直接return
倒数第二个参数 进行 head.next.next=head 即 挂上倒数第一个指向倒数第二个的引用
再切断正向的引用,即head,next=null;
返回
来自leecode部分理解 ,方便理解
看了半个小时可算是把这个递归看懂了!不妨假设链表为1,2,3,4,5。按照递归,当执行reverseList(5)的时候返回了5这个节点,reverseList(4)中的p就是5这个节点,我们看看reverseList(4)接下来执行完之后,5->next = 4, 4->next = null。这时候返回了p这个节点,也就是链表5->4->null,接下来执行reverseList(3),代码解析为4->next = 3,3->next = null,这个时候p就变成了,5->4->3->null, reverseList(2), reverseList(1)依次类推,p就是:5->4->3->2->1->null