Hard.

#### Problem Statement :

Reverse a linked list from position M to N. Do it in-place and in one-pass.

#### Example:

``````Given 1−>2−>3−>4−>5−>NULL,
M=1 and N=3,
Output:  3−>2−>1−>4−>5−>NULL.``````

See original problem statement here

## EXPLANATION:

Since we have to reverse a part of the given linked list obviously we need the best sites to learn programming languages to understand the concept of reversing the linked list. We need to find the mth node and pass it to the reverse function (which will reverse the given part). But, before passing the mth node we need to traverse to the nth node and cut its link with (n+1)th node if present.

Also we have to save the (m-1) node and also (n+1)th node address so that we can link the reversed part of the linked list again with the original linked list.

There will be four variables.
`Prev` → for storing the previous node, i.e. (m-1)th node.

`Start` → for storing the starting(mth) node of reversal.

`End` → for storing the ending node(nth) of reversal.

`Next` → for storing the next node, i.e. (n+1)th node.

Now, we will pass Start to the reverse function and then will attach the reversed part with Start and End to get the reversed linked list.

## SOLUTIONS:

``` #include <stdio.h>
#include<stdlib.h>
struct Node {
int data;
struct Node* next;
};
{
struct Node* prev = NULL;

while (curr) {
struct Node* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
struct Node* reverseBetween(struct Node* head, int m, int n)
{
if (m == n)
struct Node* revs = NULL, *revs_prev = NULL;
struct Node* revend = NULL, *revend_next = NULL;
int i = 1;
while (curr && i <= n) {
if (i < m)
revs_prev = curr;

if (i == m)
revs = curr;

if (i == n) {
revend = curr;
revend_next = curr->next;
}

curr = curr->next;
i++;
}
revend->next = NULL;
revend = reverse(revs);
if (revs_prev)
revs_prev->next = revend;
else

revs->next = revend_next;
}

{
}
printf("\n");
}
void push(struct Node** head_ref, int new_data)
{
struct Node* new_node ;
new_node=(struct Node *)malloc(sizeof(struct Node));
new_node->data = new_data;
}
int main()
{ int k;scanf("%d",&k);
int x[k];
for(int i=0;i<k;i++)
scanf("%d",&x[i]);
for(int i=k-1;i>=0;i--)
{
}
int m,n;scanf("%d%d",&m,&n);
return 0;
}
```
```class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
for(auto i = 0 ; i < m-1 ; i++){
prev = prev->next;
}
ListNode* const reversedPrev = prev;
//position m
prev = prev->next;
ListNode* cur = prev->next;
for(auto i = m ; i < n ; i++){
prev->next = cur->next;
cur->next = reversedPrev->next;
reversedPrev->next = cur;
cur = prev->next;
}
}
};
```
``` #include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node* next;
};
{
struct Node* prev = NULL;

while (curr) {
struct Node* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
Node* reverseBetween(Node* head, int m, int n)
{
if (m == n)
Node* revs = NULL, *revs_prev = NULL;
Node* revend = NULL, *revend_next = NULL;
int i = 1;
while (curr && i <= n) {
if (i < m)
revs_prev = curr;

if (i == m)
revs = curr;

if (i == n) {
revend = curr;
revend_next = curr->next;
}

curr = curr->next;
i++;
}
revend->next = NULL;
revend = reverse(revs);
if (revs_prev)
revs_prev->next = revend;
else

revs->next = revend_next;
}

{
}
printf("\n");
}
void push(struct Node** head_ref, int new_data)
{
struct Node* new_node = new Node;
new_node->data = new_data;
}
int main()
{ int k;cin>>k;
int x[k];
for(int i=0;i<k;i++)
cin>>x[i];