返回
化繁为简,通俗易懂:JavaScript代码解决LeetCode 61题“旋转链表”
前端
2023-10-29 20:22:54
简介
LeetCode 61题“旋转链表”旨在考察链表的基本操作和算法应用。该题要求将给定链表旋转一定位置,使得链表闭合形成环状。本题解提供详细的JavaScript代码解决方案,并对每一步操作进行了详细注释。通过本文,您将一步一步理解算法的细节,掌握链表旋转的技巧。
算法步骤
-
定义旋转函数
/** * 旋转链表 * * @param {ListNode} head 链表头结点 * @param {number} k 旋转位置 * @return {ListNode} 旋转后的链表头结点 */ const rotateRight = (head, k) => { if (!head || !head.next || k === 0) { return head; }
首先,我们定义了一个名为
rotateRight
的函数,它接受链表头结点和旋转位置k
作为参数,并返回旋转后的链表头结点。 -
计算链表长度
// 计算链表长度 let length = 0; let current = head; while (current) { length++; current = current.next; }
接下来,我们计算链表的长度。我们将创建一个变量
length
来存储链表的长度,并使用一个循环来遍历链表,每遍历一个节点,我们就将length
加1。 -
计算旋转位置
// 计算旋转位置 k %= length;
旋转位置
k
可能大于链表长度,因此我们需要对它进行取余运算,确保k
的值小于或等于链表长度。 -
找到新的头结点
// 找到新的头结点 let newHead = head; for (let i = 0; i < k; i++) { newHead = newHead.next; }
现在,我们需要找到旋转后的链表头结点。我们使用一个循环,循环
k
次,每次将newHead
指向下一个节点。循环结束后,newHead
指向旋转后的链表头结点。 -
闭合链表
// 闭合链表 let tail = head; while (tail.next) { tail = tail.next; } tail.next = newHead;
现在,我们需要闭合链表,将链表的尾部与新的头结点相连。我们首先找到链表的尾部,然后将尾部的
next
指针指向新的头结点。 -
返回新的头结点
return newHead;
最后,我们将新的头结点返回作为旋转后的链表。
示例
现在,让我们通过一个示例来理解算法的实际应用。假设我们有一个链表1->2->3->4->5
,我们需要将其旋转3个位置。
-
计算链表长度
length = 5
-
计算旋转位置
k = 3 % 5 = 3
-
找到新的头结点
newHead = 3
-
闭合链表
tail.next = newHead;
-
返回新的头结点
return newHead;
最终,旋转后的链表为3->4->5->1->2
。
总结
本题解提供了详细的JavaScript代码解决方案,并对每一步操作进行了详细注释。通过本文,您将一步一步理解算法的细节,掌握链表旋转的技巧。如果您有任何疑问,请随时评论,我们将尽力为您解答。