返回

化繁为简,通俗易懂:JavaScript代码解决LeetCode 61题“旋转链表”

前端

简介

LeetCode 61题“旋转链表”旨在考察链表的基本操作和算法应用。该题要求将给定链表旋转一定位置,使得链表闭合形成环状。本题解提供详细的JavaScript代码解决方案,并对每一步操作进行了详细注释。通过本文,您将一步一步理解算法的细节,掌握链表旋转的技巧。

算法步骤

  1. 定义旋转函数

    /**
     * 旋转链表
     *
     * @param {ListNode} head 链表头结点
     * @param {number} k 旋转位置
     * @return {ListNode} 旋转后的链表头结点
     */
    const rotateRight = (head, k) => {
        if (!head || !head.next || k === 0) {
            return head;
        }
    

    首先,我们定义了一个名为rotateRight的函数,它接受链表头结点和旋转位置k作为参数,并返回旋转后的链表头结点。

  2. 计算链表长度

        // 计算链表长度
        let length = 0;
        let current = head;
        while (current) {
            length++;
            current = current.next;
        }
    

    接下来,我们计算链表的长度。我们将创建一个变量length来存储链表的长度,并使用一个循环来遍历链表,每遍历一个节点,我们就将length加1。

  3. 计算旋转位置

        // 计算旋转位置
        k %= length;
    

    旋转位置k可能大于链表长度,因此我们需要对它进行取余运算,确保k的值小于或等于链表长度。

  4. 找到新的头结点

        // 找到新的头结点
        let newHead = head;
        for (let i = 0; i < k; i++) {
            newHead = newHead.next;
        }
    

    现在,我们需要找到旋转后的链表头结点。我们使用一个循环,循环k次,每次将newHead指向下一个节点。循环结束后,newHead指向旋转后的链表头结点。

  5. 闭合链表

        // 闭合链表
        let tail = head;
        while (tail.next) {
            tail = tail.next;
        }
        tail.next = newHead;
    

    现在,我们需要闭合链表,将链表的尾部与新的头结点相连。我们首先找到链表的尾部,然后将尾部的next指针指向新的头结点。

  6. 返回新的头结点

        return newHead;
    

    最后,我们将新的头结点返回作为旋转后的链表。

示例

现在,让我们通过一个示例来理解算法的实际应用。假设我们有一个链表1->2->3->4->5,我们需要将其旋转3个位置。

  1. 计算链表长度

    length = 5
    
  2. 计算旋转位置

    k = 3 % 5 = 3
    
  3. 找到新的头结点

    newHead = 3
    
  4. 闭合链表

    tail.next = newHead;
    
  5. 返回新的头结点

    return newHead;
    

最终,旋转后的链表为3->4->5->1->2

总结

本题解提供了详细的JavaScript代码解决方案,并对每一步操作进行了详细注释。通过本文,您将一步一步理解算法的细节,掌握链表旋转的技巧。如果您有任何疑问,请随时评论,我们将尽力为您解答。