reverseNodesInKGroup<T> function

LinkedListNode<T>? reverseNodesInKGroup<T>(
  1. LinkedListNode<T>? head,
  2. int k
)

Implementation

LinkedListNode<T>? reverseNodesInKGroup<T>(LinkedListNode<T>? head, int k) {
  if (head == null || k <= 1) return head;
  final dummy = LinkedListNode<T>(head.value);
  dummy.next = head;
  LinkedListNode<T>? prevGroupEnd = dummy;
  while (true) {
    LinkedListNode<T>? kth = prevGroupEnd;
    for (int i = 0; i < k && kth != null; i++) {
      kth = kth.next;
    }
    if (kth == null) break;
    LinkedListNode<T>? groupStart = prevGroupEnd!.next;
    LinkedListNode<T>? nextGroupStart = kth.next;
    // Reverse group
    LinkedListNode<T>? prev = nextGroupStart;
    LinkedListNode<T>? curr = groupStart;
    while (curr != nextGroupStart) {
      final tmp = curr!.next;
      curr.next = prev;
      prev = curr;
      curr = tmp;
    }
    prevGroupEnd.next = kth;
    prevGroupEnd = groupStart;
  }
  return dummy.next;
}