返回
旋转链表,双指针算法让难题变简单!
前端
2023-11-05 05:30:21
旋转链表问题概述
旋转链表问题如下:
给定一个链表,将链表向右旋转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代码,帮助您理解并应用这一算法。希望您能够学到一些有用的知识,并在未来的编码实践中使用它来解决类似的问题。