1 Description #
source: https://leetcode.com/problems/reverse-linked-list-ii/
Given the head of a singly linked list and two integers left and right where left < right=, reverse the nodes of the list from position left to position right, and return the reversed list.
Example 1:

Input: head = [1,2,3,4,5], left = 2, right = 4
Output: [1,4,3,2,5]
Example 2:
Input: head = [5], left = 1, right = 1
Output: [5]
Constraints:
The number of nodes in the list is n.
1 <= n <= 500-500 <= Node.val <= 5001 <= left <= right <= n
2 Solution #

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
  ListNode* reverseBetween(ListNode* head, int left, int right) {
    // time complexity: O(2N), N = size of the linked list
    // space compleixty: O(1)
    if(!head || left == right){
      return head;
    }
    ListNode* left_prev = nullptr;
    ListNode* left_node = nullptr;
    ListNode* right_node = nullptr;
    ListNode* result = nullptr;
    int size = 0;
    while(head){
      size ++;
      if(!result && size <= left - 1){
	result = head;
      }
      if(size == left - 1){
	left_prev = head;
      }
      if(size == left){
	left_node = head;
      }
      if(size == right){
	right_node = head;
      }
      head = head->next;
    }
    ListNode* right_node_next = right_node -> next;
    right_node-> next = nullptr;
    if(!result){
      result = right_node;
    }
    while(left_node){
      ListNode* left_next = left_node->next;
      left_node->next = right_node_next;
      right_node_next = left_node;
      if(!left_next && left_prev){
	left_prev -> next = left_node;
      }
      left_node = left_next;
    }
    return result;
  }
};