返回

把链表调个个儿,JS也能轻松搞定,25题完美解答

前端

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;
};

算法流程

  1. 我们首先创建一个虚拟节点 dummy,并将其指向链表的头部。
  2. 然后,我们使用两个指针 prevend 来遍历链表。
  3. prev 指向当前翻转的链表的尾部,end 指向当前翻转的链表的末尾。
  4. 我们使用一个 for 循环来找到要翻转的链表的末尾。
  5. 如果 end 指向 null,则说明我们已经遍历到链表的末尾,我们停止遍历。
  6. 否则,我们使用 reverseList() 函数来翻转链表的当前部分。
  7. 我们将翻转后的链表连接到 prev 节点的后面。
  8. 我们更新 prevend 指针,继续遍历链表。
  9. 当我们遍历完整个链表后,我们返回 dummy.next 作为翻转后的链表。

算法复杂度

  • 时间复杂度:O(n),其中 n 是链表的长度。
  • 空间复杂度:O(1),因为我们没有使用额外的空间。

结语

希望这篇文章对您有所帮助!如果您有任何问题或建议,请随时留言。