Reverse a sublist of linked list - GeeksforGeeks

18 Apr, 2022
We are given a linked list and positions m and n. We need to reverse the linked list from position m to n.
Examples:  
Input : 10->20->30->40->50->60->70->NULL
        m = 3, n = 6
Output : 10->20->60->50->40->30->70->NULL

Input :  1->2->3->4->5->6->NULL 
         m = 2, n = 4
Output : 1->4->3->2->5->6->NULL
To reverse the linked list from position m to n, we find addresses of start and end position of the linked list by running a loop, and then we unlink this part from the rest of the list and then use the normal linked list reverse function which we have earlier used for reversing the complete linked list, and use it to reverse the portion of the linked list which need to be reversed. After reversal, we again attach the portion reversed to the main list.
C++
C
Python3
// C++ program to reverse a linked list// from position m to position n#include <bits/stdc++.h>using namespace std; // Linked list nodestruct Node {    int data;    struct Node* next;}; // function used to reverse a linked liststruct Node* reverse(struct Node* head){    struct Node* prev = NULL;    struct Node* curr = head;    while (curr) {        struct Node* next = curr->next;        curr->next = prev;        prev = curr;        curr = next;    }    return prev;} // function used to reverse a linked list from position m to nNode* reverseBetween(Node* head, int m, int n){    if (m == n)        return head;     // revs and revend is start and end respectively of the    // portion of the linked list which need to be reversed.    // revs_prev is previous of starting position and    // revend_next is next of end of list to be reversed.    Node *revs = NULL, *revs_prev = NULL;    Node *revend = NULL, *revend_next = NULL;     // Find values of above pointers.    int i = 1;    Node* curr = head;    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;    // Reverse linked list starting with revs.    revend = reverse(revs);    // If starting position was not head    if (revs_prev)        revs_prev->next = revend;    // If starting position was head    else        head = revend;    revs->next = revend_next;    return head;} void print(struct Node* head){    while (head != NULL) {        cout<<head->data<<" ";        head = head->next;    }    cout<<endl;} // function to add a new node at the// beginning of the listvoid push(struct Node** head_ref, int new_data){    struct Node* new_node = new Node;    new_node->data = new_data;    new_node->next = (*head_ref);    (*head_ref) = new_node;} // Driver codeint main(){    struct Node* head = NULL;    push(&head, 70);    push(&head, 60);    push(&head, 50);    push(&head, 40);    push(&head, 30);    push(&head, 20);    push(&head, 10);    reverseBetween(head, 3, 6);    print(head);    return 0;} // This code is contributed by Aditya Kumar (adityakumar129)
// C program to reverse a linked list// from position m to position n#include <stdio.h>#include <stdlib.h> // Linked list nodetypedef struct Node {    int data;    struct Node* next;} Node; // function used to reverse a linked listNode* reverse(Node* head){    Node* prev = NULL;    Node* curr = head;    while (curr) {        Node* next = curr->next;        curr->next = prev;        prev = curr;        curr = next;    }    return prev;} // function used to reverse a linked list from position m to nNode* reverseBetween(Node* head, int m, int n){    if (m == n)        return head;     // revs and revend is start and end respectively of the    // portion of the linked list which need to be reversed.    // revs_prev is previous of starting position and    // revend_next is next of end of list to be reversed.    Node *revs = NULL, *revs_prev = NULL;    Node *revend = NULL, *revend_next = NULL;     // Find values of above pointers.    int i = 1;    Node* curr = head;    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;    // Reverse linked list starting with revs.    revend = reverse(revs);    // If starting position was not head    if (revs_prev)        revs_prev->next = revend;    // If starting position was head    else        head = revend;    revs->next = revend_next;    return head;} void print(Node* head){    while (head != NULL) {        printf("%d ", head->data);        head = head->next;    }    printf("\n");} // function to add a new node at the beginning of the listvoid push(Node** head_ref, int new_data){    Node* new_node = (Node*)malloc(sizeof(Node));    new_node->data = new_data;    new_node->next = (*head_ref);    (*head_ref) = new_node;} // Driver codeint main(){    Node* head = NULL;    push(&head, 70);    push(&head, 60);    push(&head, 50);    push(&head, 40);    push(&head, 30);    push(&head, 20);    push(&head, 10);    reverseBetween(head, 3, 6);    print(head);    return 0;} // This code is contributed by Aditya Kumar (adityakumar129)
# Python3 program to reverse a linked list# from position m to position n  # Linked list nodeclass Node:         def __init__(self, data):                 self.data = data        self.next = None # The standard reverse function used# to reverse a linked listdef reverse(head):     prev = None      curr = head      while (curr):        next = curr.next        curr.next = prev        prev = curr        curr = next         return prev  # Function used to reverse a linked list# from position m to n which uses reverse# functiondef reverseBetween(head, m, n):     if (m == n):        return head             # revs and revend is start and end respectively    # of the portion of the linked list which    # need to be reversed. revs_prev is previous    # of starting position and revend_next is next    # of end of list to be reversed.    revs = None    revs_prev = None    revend = None    revend_next = None      # Find values of above pointers.    i = 1    curr = head         while (curr and 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 += 1     revend.next = None      # Reverse linked list starting with    # revs.    revend = reverse(revs)      # If starting position was not head    if (revs_prev):        revs_prev.next = revend      # If starting position was head    else:        head = revend      revs.next = revend_next    return head def prints(head):     while (head != None):        print(head.data, end = ' ')        head = head.next             print() # Function to add a new node at the# beginning of the listdef push(head_ref, new_data):     new_node = Node(new_data)    new_node.data = new_data    new_node.next = (head_ref)    (head_ref) = new_node    return head_ref # Driver codeif __name__=='__main__':         head = None    head = push(head, 70)    head = push(head, 60)    head = push(head, 50)    head = push(head, 40)    head = push(head, 30)    head = push(head, 20)    head = push(head, 10)         reverseBetween(head, 3, 6)         prints(head)     # This code is contributed by rutvik_56
Output:
10 20 60 50 40 30 70
This article is contributed by Akshit Agarwal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
Akanksha_Rai
rutvik_56
Reverse
Linked List
Linked List
Reverse
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Delete a Linked List node at a given position
Queue - Linked List Implementation
Implement a stack using singly linked list
Implementing a Linked List in Java using Class
Circular Linked List | Set 1 (Introduction and Applications)
Remove duplicates from a sorted linked list
Find Length of a Linked List (Iterative and Recursive)
Function to check if a singly linked list is palindrome
Write a function to delete a Linked List
Search an element in a Linked List (Iterative and Recursive)