algorighm/top-interview-leetcode150/link/25k个一组反转链表.js

86 lines
2.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
const reverseKGroup = function (head, k) {
};
function ListNode(val, next) {
this.val = (val === undefined ? 0 : val);
this.next = (next === undefined ? null : next);
}
/*
这个问题可以拆解成n个leetcode的子问题直接利用k把区间划分出来调用reverseBetween即可
*/
function f1(head, k) {
// 利用哑节点来处理头节点问题
const dummyHead = new ListNode(-1);
dummyHead.next = head;
let left = 2;
let right = left + k - 1;
const n = getListLength(dummyHead);
while (right <= n) {
reverseBetween(, left, right);
left = right + 1;
right = left + k - 1;
}
return dummyHead.next;
}
/**
*
* @param {*} head 头节点
* @param {*} left 要反转的区域的第一个节点
* @param {*} right 要反转的区域的最后一个节点
* @returns 返回区域反转后的节点
*/
const reverseBetween = function (head, left, right) {
const dummyHead = new ListNode(-1); // 创建一个哑节点,简化边界情况
dummyHead.next = head; // 哑节点的next指向链表头
let pre = dummyHead; // `pre` 用于指向 `left` 前一个节点
// 寻找 `left` 的前一个节点
for (let i = 0; i < left - 1; i++) {
pre = pre.next;
}
const cur = pre.next; // `cur` 指向要反转部分的第一个节点
// 从 `left` 到 `right` 反转链表部分
for (let i = 0; i < right - left; i++) {
const next = cur.next; // `next` 指向当前节点的下一个节点
cur.next = next.next; // 跳过 `next` 节点
next.next = pre.next; // 将 `next` 插入到 `cur` 前面
pre.next = next; // 更新 `pre.next` 为 `next`
}
return dummyHead.next; // 返回反转后的链表
};
/**
* 获取链表的节点个数
* @param {ListNode} head - 链表的头节点
* @return {number} - 链表的节点个数
*/
let getListLength = function (head) {
let count = 0; // 初始化计数器
let current = head; // 初始化当前节点为链表头
// 遍历整个链表,直到链表末尾
while (current !== null) {
count++; // 每遍历一个节点,计数器加一
current = current.next; // 移动到下一个节点
}
return count; // 返回链表的长度
};