翻转链表
1->null 不用翻转直接返回首结点1
2->1->null 断开2 翻转1->null 1->2->null
3->2->1->null 断开3 翻转2->1->null
4->3->2->1->null 断开4 翻转3->2->1->null
所谓断开首结点,翻转断开首结点后的新链表,这整个过程其实就是在寻找null前的那个结点,也就是我们最后得到的翻转链表的首结点
- 关键点1:获取null前的那个结点
- 关键点2:两结点单链表翻转的具象理解
Node recursiveReverse(Node node)
If n.next == null return n
// 获取null前的那个节点 即是最后要的链表首节点
// 思考过程是把这个递归完全展开
Node last = recursiveReverse(n.next) //通俗理解:就是把当前传入的首结点断开,执行断开首结点后新链表的翻转
n.next.next = n // 具象理解:2->1->null n.next就是1,n.next.next就是给1的next赋值,即1的next本来是指向null,现在指向1的前一个结点,
n.next = null // 原先首结点的next 翻转最后肯定是指向null
return last
recursiveReverse(4)
last = recursiveReverse(3)
// 递归过程展开
1.next == null return 1
2.next.next=2
2.next=null
3.next.next = 3
3.next = null
4.next.next = 4 // 注意 4.next.next 就是 3.next
4.next=null
最终代码
ListNode recursiveReverse(ListNode head) {
if (head.next == null) return head;
ListNode last = recursiveReverse(head.next);
head.next.next = head;
head.next = null;
return last;
}