Iterative

Node reverse(Node head) {
  Node prev = null, cur = head;
  while (cur != null) {
    Node next = cur.next;
    cur.next = prev;
    prev = cur;
    cur = next;
  }
  return prev;
}
Advertisement

Recursive

Node reverse(Node head) {
  if (head == null || head.next == null) return head;
  Node newHead = reverse(head.next);
  head.next.next = head;
  head.next = null;
  return newHead;
}
Advertisement

Reverse in groups of K

Node reverseK(Node head, int k) {
  Node cur = head;
  int count = 0;
  while (cur != null && count < k) { cur = cur.next; count++; }
  if (count < k) return head;
  Node prev = reverseK(cur, k);
  while (count-- > 0) {
    Node next = head.next;
    head.next = prev;
    prev = head;
    head = next;
  }
  return prev;
}

Reverse between positions m..n

Skip to position m-1. Reverse next (n-m+1) nodes iteratively. Reconnect.