返回

旋转链表,双指针算法让难题变简单!

前端

旋转链表问题概述

旋转链表问题如下:

给定一个链表,将链表向右旋转k个位置,其中k是一个非负整数。

例如,给定链表1->2->3->4->5->NULL和k=2,旋转链表后得到3->4->5->1->2->NULL。

双指针算法解析

为了解决旋转链表问题,我们将使用双指针算法。双指针算法是一种常见的链表算法,它使用两个指针来遍历链表,从而实现各种操作。在旋转链表问题中,我们将使用两个指针:

  • fast指针 :从链表头节点开始,每次向前移动k个位置。
  • slow指针 :从链表头节点开始,每次向前移动1个位置。

当fast指针到达链表尾部时,slow指针将指向要成为新链表头节点的位置。此时,我们可以将slow指针指向的节点设置为新链表的头节点,并将fast指针指向的节点设置为新链表的尾节点。最后,将旧链表的尾节点指向新链表的头节点,即可完成链表的旋转。

JavaScript代码实现

/*
 * @param {ListNode} head 链表的头节点
 * @param {number} k 要旋转的位置数
 * @return {ListNode} 旋转后的链表的头节点
 */
const rotateRight = (head, k) => {
  // 检查链表是否为空或k为0
  if (!head || k === 0) {
    return head;
  }

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

  // 将k转换为正整数
  k = k % length;

  // 使用双指针找到要旋转的位置
  let fast = head;
  let slow = head;
  for (let i = 0; i < k; i++) {
    fast = fast.next;
  }

  // 移动slow指针和fast指针
  while (fast.next) {
    slow = slow.next;
    fast = fast.next;
  }

  // 将链表旋转
  const newHead = slow.next;
  slow.next = null;
  fast.next = head;

  // 返回旋转后的链表的头节点
  return newHead;
};

运行结果示例

以下是一个运行结果示例:

console.log(rotateRight([1, 2, 3, 4, 5], 2)); // [3, 4, 5, 1, 2]
console.log(rotateRight([0, 1, 2], 4)); // [2, 0, 1]
console.log(rotateRight([1], 1)); // [1]

总结

在本文中,我们使用双指针算法解决了LeetCode 61题:旋转链表。我们提供了详细的JavaScript代码,帮助您理解并应用这一算法。希望您能够学到一些有用的知识,并在未来的编码实践中使用它来解决类似的问题。