原题链接:https://leetcode-cn.com/problems/reverse-linked-list/
假设有链表1->2->3->4->5->NULL
,那么递归的步骤如下:
headNext
其实是5,此时链表还是`1->2->3->4->5->NULL``head.next.next = head;
后,实际上是把5的指向修改成了4,此时链表变成了1->2->3->4<=>5
,4和5互相指向了。head.next = null;
后,链表变成了1->2->3->4<-5
+4->NULL
,需要注意的是,此时4被3和5同时指向,而且4还有个隐藏的指向为null。1->2->3->4
和NULL<-4<-5
。5->4
headNext
其实是5->4
,此时链表是1->2->3->4<-5
+4->NULL
head.next.next = head;
后,3和4的指向被翻转,而此时还存在一个5->4
的指向,那么链表变成了1->2->3<=>4<->5
,3和4互相指向了。head.next = null;
后,链表变成了1->2->3<-4<-5
+3->NULL
,需要注意的是,此时3被2和4同时指向,而且3还有个隐藏的指向为null。1->2->3
和NULL<-3<-4<-5
。5->4->3
。NULL<-1<-2<-3<-4<-5
。/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function (head) {
// 避免节点为空,或者只有1个节点的情况
if (head === null || head.next === null) {
return head;
}
// 请注意下面注释中的head、head.prev、head.next都指的是原数组中的节点
// reverseList返回的节点实际上就是head.next
const headNext = reverseList(head.next);
// 将head.next指向head,完成两者指向的翻转
// 但此时的指向实际变成了head.prev -> head <=> head.next
// 也就是说head和head.next互相指向了
head.next.next = head;
// 清空head的指向
head.next = null;
// 将head.next返回给上层调用
return headNext;
};