64.反转链表

书诚小驿2025/02/21前端面经算法JavaScript

反转链表

题目

请实现一个函数 reverseLinkedList,该函数接收两个参数: 一个链表的头节点 head,表示一个单向链表。 一个整数 k,表示需要反转的子链表的长度。 函数的功能是将链表中每 k 个节点进行反转,如果链表的剩余节点不足 k 个,则不进行反转。最后返回新的头节点。

链表节点定义

class ListNode {
  constructor(val = 0, next = null) {
    this.val = val;
    this.next = next;
  }
}

示例 :

/* 
输入:
  head:链表的头节点。
  k:一个整数,表示每组需要反转的节点数。
输出:
  返回一个新的链表头节点,表示反转后的链表。 */

// demo1
// 给定链表 1->2->3->4->5 和 k = 2
// 应返回 2->1->4->5->3
const head1 = new ListNode(
  1,
  new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5))))
);
const k1 = 2;
const result1 = reverseLinkedList(head1, k1);
console.log(result1); // 输出:2->1->4->5->3

// demo2
// 给定链表 1->2->3->4->5 和 k = 3
// 应返回 3->2->1->4->5
const head2 = new ListNode(
  1,
  new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5))))
);
const k2 = 3;
const result2 = reverseLinkedList(head2, k2);
console.log(result2); // 输出:3->2->1->4->5

要求

TIP

  1. 请使用 JavaScript 实现该函数。
  2. 在代码中添加必要的注释,说明关键步骤和逻辑。
  3. 考虑边界情况,如链表为空、k 大于链表长度等。

参考答案

DETAILS
<script>
    class ListNode {
        constructor(val = 0, next = null) {
          this.val = val;
          this.next = next;
        }
      }

      function reverseLinkedList(head, k) {
        // 辅助函数:反转链表的前 k 个节点
        function reverseKNodes(head, k) {
          let current = head;
          let prev = null;
          let count = 0;

          // 反转前 k 个节点
          while (current && count < k) {
            const nextNode = current.next;
            current.next = prev;
            prev = current;
            current = nextNode;
            count++;
          }

          // 如果不足 k 个节点,恢复链表
          if (count < k) {
            current = prev;
            prev = null;
            while (current) {
              const nextNode = current.next;
              current.next = prev;
              prev = current;
              current = nextNode;
            }
            return head;
          }

          // 连接剩余部分
          head.next = current;
          return prev;
        }

        // 主函数:处理整个链表
        let dummy = new ListNode(0);
        dummy.next = head;
        let start = dummy;

        while (start.next) {
          start.next = reverseKNodes(start.next, k);
          for (let i = 0; i < k && start.next; i++) {
            start = start.next;
          }
        }

        return dummy.next;
      }

      // 测试用例
      const head1 = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5)))));
      const k1 = 2;
      const result1 = reverseLinkedList(head1, k1);
      console.log(result1); // 输出:2->1->4->5->3

      const head2 = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5)))));
      const k2 = 3;
      const result2 = reverseLinkedList(head2, k2);
      console.log(result2); // 输出:3->2->1->4->5

      const head3 = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5)))));
      const k3 = 6;
      const result3 = reverseLinkedList(head3, k3);
      console.log(result3); // 输出:1->2->3->4->5
  </script>
最后更新时间' 2025/2/23 01:48:16