K 个一组翻转链表

100 阅读1分钟

K 个一组翻转链表

  1. 新建一个head前面的hair节点

    var reverseKGroup = function (head, k) {
      const hair = new ListNode(-1, head);
    };
    
    1. head开始k个翻转, 注意此时会先遍历从开始是否有k个节点
    var reverseKGroup = function (head, k) {
      const hair = new ListNode(-1, head);
      let cur = hair;
      cur.next = reverse(cur.next, k);
    };
    function reverse(head, k) {
      let count = k;
      let cur = head;
      while (--count && cur) {
        cur = cur.next;
      }
      // 表示从 head 开始没有 k 个节点
      if (!cur) return head;
      // 至少有k个节点
      cur = head;
      let prev = null;
      while (k--) {
        const next = head.next;
        cur.next = prev;
        prev = cur;
        cur = next;
      }
      head.next = cur;
      return prev;
    }
    
    1. 上述是开始翻转了headk个节点,那么需要继续找到head之后的第k个节点继续翻转
    var reverseKGroup = function (head, k) {
      const hair = new ListNode(-1, head);
      let cur = hair;
      // 为的是一直遍历
      do {
        cur.next = reverse(cur.next, k);
        for (let i = 0; i < k && cur; i++) {
          cur = cur.next;
        }
        if (!cur) return hair.next;
      } while (true);
    };
    function reverse(head, k) {
      let count = k;
      let cur = head;
      while (--count && cur) {
        cur = cur.next;
      }
      // 表示从 head 开始没有 k 个节点
      if (!cur) return head;
      // 至少有k个节点
      cur = head;
      let prev = null;
      while (k--) {
        const next = head.next;
        cur.next = prev;
        prev = cur;
        cur = next;
      }
      head.next = cur;
      return prev;
    }