之前写过一个关于链表翻转问题的文章,在这篇文章中,关于反转链表,只有一个双指针的实现方式,在刷题时又遇到了另一个显得高大上的的解法(理解起来难,但是看起来很厉害的样子)-- 递归法。
题目要求
给定一个单链表的头结点head,长度为n,反转该链表后,返回新链表的表头。
我们先上代码,先目睹一下递归的优雅
// 递归翻转
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
// 递归
ListNode node = reverseList2(head.next);
// 这里才是关键
head.next.next = head;
head.next = null;
return node;
}
看了如上代码之后,我第一眼看上去,觉得这代码貌似有点bug,但是试验了一下又是对的,我不禁想了一下,为什么它能实现呢?
其实,他最关键的是在于,新链表与旧链表共享同一个尾节点。
看图
执行 head.next.next = head
执行 head.next = null;
此时,旧链表与新链表共享同一个尾部Node(4).并且执行return node;
执行 head.next.next = head
执行 head.next = null;
剩余步骤一致。。。