返回
把链表调个个儿,JS也能轻松搞定,25题完美解答
前端
2023-10-31 06:14:04
JS代码实现
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
const reverseKGroup = function (head, k) {
if (head === null || k === 1) {
return head;
}
let dummy = new ListNode(0);
dummy.next = head;
let prev = dummy;
let end = dummy;
while (end.next !== null) {
for (let i = 0; i < k && end !== null; i++) {
end = end.next;
}
if (end === null) {
break;
}
let start = prev.next;
let next = end.next;
end.next = null;
prev.next = reverseList(start);
start.next = next;
prev = start;
end = prev;
}
return dummy.next;
};
const reverseList = function (head) {
if (head === null || head.next === null) {
return head;
}
let prev = null;
let current = head;
while (current !== null) {
let next = current.next;
current.next = prev;
prev = current;
current = next;
}
return prev;
};
算法流程
- 我们首先创建一个虚拟节点
dummy
,并将其指向链表的头部。 - 然后,我们使用两个指针
prev
和end
来遍历链表。 prev
指向当前翻转的链表的尾部,end
指向当前翻转的链表的末尾。- 我们使用一个
for
循环来找到要翻转的链表的末尾。 - 如果
end
指向null
,则说明我们已经遍历到链表的末尾,我们停止遍历。 - 否则,我们使用
reverseList()
函数来翻转链表的当前部分。 - 我们将翻转后的链表连接到
prev
节点的后面。 - 我们更新
prev
和end
指针,继续遍历链表。 - 当我们遍历完整个链表后,我们返回
dummy.next
作为翻转后的链表。
算法复杂度
- 时间复杂度:O(n),其中 n 是链表的长度。
- 空间复杂度:O(1),因为我们没有使用额外的空间。
结语
希望这篇文章对您有所帮助!如果您有任何问题或建议,请随时留言。