返回

前端菜鸟必看:LeetCode 旋转链表攻略

前端

在前端开发的广阔领域中,算法能力正变得愈发重要。对于初出茅庐的前端开发者来说,掌握解决算法问题的技巧至关重要。LeetCode 是一家提供海量算法题目的在线平台,深受前端工程师的青睐。本文将聚焦于 LeetCode 上一道经典算法题 - 旋转链表,并提供一份详细的攻略,帮助前端菜鸟轻松掌握这道题目的解法。

何为旋转链表

旋转链表是一个操作链表的数据结构问题。给定一个链表和一个旋转步数 k,目标是将链表向右旋转 k 个位置。例如,对于链表 [1, 2, 3, 4, 5],如果 k = 2,旋转后的链表将变为 [4, 5, 1, 2, 3]。

算法解法

要解决旋转链表问题,我们需要采用一种巧妙的策略:

  1. 形成闭环: 首先,将链表形成一个闭环,即将链表的尾节点指向头节点。这将使链表成为一个循环链表。
  2. 断开闭环: 接下来,从链表的第 (n - k) 个节点处断开闭环,其中 n 是链表的长度。这将把链表分为两部分:第一部分将成为旋转后的链表头,第二部分将成为尾部。
  3. 连接链表: 最后,将第二部分的尾节点指向第一部分的头节点,完成链表的旋转。

代码实现

以下是用 JavaScript 实现的旋转链表算法:

const rotateRight = (head, k) => {
  // 如果链表为空或 k 为 0,则直接返回 head
  if (!head || !k) return head;

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

  // 将链表形成闭环
  curr = head;
  while (curr.next) {
    curr = curr.next;
  }
  curr.next = head;

  // 断开闭环并连接链表
  let count = length - k % length;
  while (count--) {
    curr = curr.next;
  }
  const newHead = curr.next;
  curr.next = null;

  return newHead;
};

举个例子

假设我们有一个链表 [1, 2, 3, 4, 5],k = 2。

  1. 形成闭环:
    1 -> 2 -> 3 -> 4 -> 5 -> 1
    
  2. 断开闭环:
    (1 -> 2 -> 3) -> (4 -> 5 -> 1)
    
  3. 连接链表:
    4 -> 5 -> 1 -> 2 -> 3
    
    因此,旋转后的链表为 [4, 5, 1, 2, 3]。

总结

旋转链表算法看似复杂,但通过将链表形成闭环再断开闭环的巧妙策略,我们可以轻松解决这个问题。掌握了这种解法,你将能够自信地应对 LeetCode 上类似的算法难题。前端开发之路漫漫,不断提升算法能力是成为一名优秀工程师的关键一步。希望这份攻略能够助你轻松攻克 LeetCode,在前端算法的道路上大显身手。