链表反转

力扣206

代码及注释

var reverse = function(head) {
    if (head === null || head.next === null) {
        return head;
    }
    var last = reverse(head.next);
    head.next.next = head;
    head.next = null;
    return last;
};

代码拆分讲解注释

首先,这是一个递归实现的链表反转算法。它会接收一个以 head 为头结点的链表作为参数,并返回一个以原链表尾结点为头结点的新链表。

var reverse = function(head) {

这个代码行定义了一个 reverse 函数,并将它赋值给了变量 reverse。

if (head === null || head.next === null) {
    return head;
}

这行表示当我们传入的链表为空(null) 或者它的下一个节点(head.next)为空时,说明反转已经完成了,此时直接返回原链表头结点即可。

var last = reverse(head.next);

否则,我们先递归地调用 reverse 函数,传入 head.next 作为参数,并将返回值赋值给变量 last。这实际上是将尾结点变成了头结点,调用 reverse 函数来反转链表中头结点之后的所有节点。

head.next.next = head;

递归完成后,我们需要将原链表的尾结点连接到新链表的头结点后面,而这个代码就是实现这一步的关键。我们把反转后的链表的尾结点的“下一个节点的下一个节点”指向头结点,这样就把原链表的尾结点连接到了新链表之后。

head.next = null;

接下来,我们将头结点的“下一个节点”指向 null,也就是把原链表的前一个节点与新链表的后一个节点断开,这样就完成了一个节点的反转。

return last;

最后,我们返回变量 last,也就是以原链表尾结点为头结点的新链表。函数执行结束。

这个算法的实现非常简练,核心思想就是通过递归来反转链表,并在递归完成后进行必要的连接操作。

视频

如果还不懂可以看bi站视频

https://www.bilibili.com/video/BV1bg4y1s7vS/?spm_id_from=333.337.search-card.all.click&vd_source=eb3630fcd0906842bebeaec1719f522f