Open In App

Reverse first K elements of given linked list

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

Given a pointer to the head node of a linked list and a number K, the task is to reverse the first K nodes of the linked list. We need to reverse the list by changing links between nodes. 
check also Reversal of a linked list

Examples: 

Input : 1->2->3->4->5->6->7->8->9->10->NULL, k = 3
Output : 3->2->1->4->5->6->7->8->9->10->NULL

Input : 10->18->20->25->35->NULL, k = 2
Output : 18->10->20->25->35->NULL 

Explanation of the method: 
suppose linked list is 1->2->3->4->5->NULL and k=3
1) Traverse the linked list till K-th point. 
2) Break the linked list in to two parts from k-th point. After partition linked list will look like 1->2->3->NULL & 4->5->NULL 
3) Reverse first part of the linked list leave second part as it is 3->2->1->NULL and 4->5->NULL 
4) Join both the parts of the linked list, we get 3->2->1->4->5->NULL
A pictorial representation of how the algorithm works 

 

C++




// C++ program for reversal of first k elements
// of given linked list
#include <bits/stdc++.h>
using namespace std;
 
/* Link list node */
struct Node {
    int data;
    struct Node* next;
};
 
/* Function to reverse first k elements of linked list */
static void reverseKNodes(struct Node** head_ref, int k)
{
    // traverse the linked list until break
    // point not meet
    struct Node* temp = *head_ref;
    int count = 1;
    while (count < k) {
        temp = temp->next;
        count++;
    }
 
    // backup the joint point
    struct Node* joint_point = temp->next;
    temp->next = NULL; // break the list
 
    // reverse the list till break point
    struct Node* prev = NULL;
    struct Node* current = *head_ref;
    struct Node* next;
    while (current != NULL) {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }
 
    // join both parts of the linked list
    // traverse the list until NULL is not
    // found
    *head_ref = prev;
    current = *head_ref;
    while (current->next != NULL)
        current = current->next;
 
    // joint both part of the list
    current->next = joint_point;
}
 
/* Function to push a node */
void push(struct Node** head_ref, int new_data)
{
    struct Node* new_node =
          (struct Node*)malloc(sizeof(struct Node));
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}
 
/* Function to print linked list */
void printList(struct Node* head)
{
    struct Node* temp = head;
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }
}
 
/* Driver program to test above function*/
int main()
{
    // Create a linked list 1->2->3->4->5
    struct Node* head = NULL;
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);
 
    // k should be less than the
    // numbers of nodes
    int k = 3;
 
    cout << "\nGiven list\n";
    printList(head);
 
    reverseKNodes(&head, k);
 
    cout << "\nModified list\n";
    printList(head);
 
    return 0;
}


Java




// Java program for reversal of first k elements
// of given linked list
class Sol
{
     
// Link list node
static class Node
{
    int data;
    Node next;
};
 
// Function to reverse first k elements of linked list
static Node reverseKNodes( Node head_ref, int k)
{
    // traverse the linked list until break
    // point not meet
    Node temp = head_ref;
    int count = 1;
    while (count < k)
    {
        temp = temp.next;
        count++;
    }
 
    // backup the joint point
    Node joint_point = temp.next;
    temp.next = null; // break the list
 
    // reverse the list till break point
    Node prev = null;
    Node current = head_ref;
    Node next;
    while (current != null)
    {
        next = current.next;
        current.next = prev;
        prev = current;
        current = next;
    }
 
    // join both parts of the linked list
    // traverse the list until null is not
    // found
    head_ref = prev;
    current = head_ref;
    while (current.next != null)
        current = current.next;
 
    // joint both part of the list
    current.next = joint_point;
    return head_ref;
}
 
// Function to push a node
static Node push( Node head_ref, int new_data)
{
    Node new_node = new Node();
    new_node.data = new_data;
    new_node.next = (head_ref);
    (head_ref) = new_node;
    return head_ref;
}
 
// Function to print linked list
static void printList( Node head)
{
    Node temp = head;
    while (temp != null)
    {
        System.out.printf("%d ", temp.data);
        temp = temp.next;
    }
}
 
// Driver program to test above function
public static void main(String args[])
{
    // Create a linked list 1.2.3.4.5
    Node head = null;
    head = push(head, 5);
    head = push(head, 4);
    head = push(head, 3);
    head = push(head, 2);
    head = push(head, 1);
 
    // k should be less than the
    // numbers of nodes
    int k = 3;
 
    System.out.print("\nGiven list\n");
    printList(head);
 
    head = reverseKNodes(head, k);
 
    System.out.print("\nModified list\n");
    printList(head);
}
}
 
// This code is contributed by Arnab Kundu


Python




# Python program for reversal of first k elements
# of given linked list
 
# Node of a linked list
class Node:
    def __init__(self, next = None, data = None):
        self.next = next
        self.data = data
 
# Function to reverse first k elements of linked list
def reverseKNodes(head_ref, k) :
 
    # traverse the linked list until break
    # point not meet
    temp = head_ref
    count = 1
    while (count < k):
     
        temp = temp.next
        count = count + 1
     
    # backup the joint point
    joint_point = temp.next
    temp.next = None # break the list
 
    # reverse the list till break point
    prev = None
    current = head_ref
    next = None
    while (current != None):
     
        next = current.next
        current.next = prev
        prev = current
        current = next
     
    # join both parts of the linked list
    # traverse the list until None is not
    # found
    head_ref = prev
    current = head_ref
    while (current.next != None):
        current = current.next
 
    # joint both part of the list
    current.next = joint_point
    return head_ref
 
# Function to push a node
def push(head_ref, new_data) :
 
    new_node = Node()
    new_node.data = new_data
    new_node.next = (head_ref)
    (head_ref) = new_node
    return head_ref
 
# Function to print linked list
def printList( head) :
 
    temp = head
    while (temp != None):
     
        print(temp.data, end = " ")
        temp = temp.next
     
# Driver program to test above function
 
# Create a linked list 1.2.3.4.5
head = None
head = push(head, 5)
head = push(head, 4)
head = push(head, 3)
head = push(head, 2)
head = push(head, 1)
 
# k should be less than the
# numbers of nodes
k = 3
 
print("\nGiven list")
printList(head)
 
head = reverseKNodes(head, k)
 
print("\nModified list")
printList(head)
 
# This code is contributed by Arnab Kundu


C#




// C# program for reversal of first k elements
// of given linked list
using System;
     
class GFG
{
     
// Link list node
public class Node
{
    public int data;
    public Node next;
};
 
// Function to reverse first k elements of linked list
static Node reverseKNodes(Node head_ref, int k)
{
     
    // traverse the linked list until break
    // point not meet
    Node temp = head_ref;
    int count = 1;
    while (count < k)
    {
        temp = temp.next;
        count++;
    }
 
    // backup the joint point
    Node joint_point = temp.next;
    temp.next = null; // break the list
 
    // reverse the list till break point
    Node prev = null;
    Node current = head_ref;
    Node next;
    while (current != null)
    {
        next = current.next;
        current.next = prev;
        prev = current;
        current = next;
    }
 
    // join both parts of the linked list
    // traverse the list until null is not
    // found
    head_ref = prev;
    current = head_ref;
    while (current.next != null)
        current = current.next;
 
    // joint both part of the list
    current.next = joint_point;
    return head_ref;
}
 
// Function to push a node
static Node push( Node head_ref, int new_data)
{
    Node new_node = new Node();
    new_node.data = new_data;
    new_node.next = (head_ref);
    (head_ref) = new_node;
    return head_ref;
}
 
// Function to print linked list
static void printList( Node head)
{
    Node temp = head;
    while (temp != null)
    {
        Console.Write("{0} ", temp.data);
        temp = temp.next;
    }
}
 
// Driver Code
public static void Main(String []args)
{
    // Create a linked list 1.2.3.4.5
    Node head = null;
    head = push(head, 5);
    head = push(head, 4);
    head = push(head, 3);
    head = push(head, 2);
    head = push(head, 1);
 
    // k should be less than the
    // numbers of nodes
    int k = 3;
 
    Console.Write("Given list\n");
    printList(head);
 
    head = reverseKNodes(head, k);
 
    Console.Write("\nModified list\n");
    printList(head);
}
}
 
// This code is contributed by Princi Singh


Javascript




<script>
 
// Javascript program for reversal of first k elements
// of given linked list
     
// Link list node
class Node
{
    constructor()
    {
        this.data = 0;
        this.next = null;
    }
};
 
// Function to reverse first k elements of linked list
function reverseKNodes(head_ref, k)
{
     
    // traverse the linked list until break
    // point not meet
    var temp = head_ref;
    var count = 1;
    while (count < k)
    {
        temp = temp.next;
        count++;
    }
 
    // backup the joint point
    var joint_point = temp.next;
    temp.next = null; // break the list
 
    // reverse the list till break point
    var prev = null;
    var current = head_ref;
    var next;
    while (current != null)
    {
        next = current.next;
        current.next = prev;
        prev = current;
        current = next;
    }
 
    // join both parts of the linked list
    // traverse the list until null is not
    // found
    head_ref = prev;
    current = head_ref;
    while (current.next != null)
        current = current.next;
 
    // joint both part of the list
    current.next = joint_point;
    return head_ref;
}
 
// Function to push a node
function push( head_ref, new_data)
{
    var new_node = new Node();
    new_node.data = new_data;
    new_node.next = (head_ref);
    (head_ref) = new_node;
    return head_ref;
}
 
// Function to print linked list
function printList( head)
{
    var temp = head;
    while (temp != null)
    {
        document.write(temp.data+ " ");
        temp = temp.next;
    }
}
 
// Driver Code
// Create a linked list 1.2.3.4.5
var head = null;
head = push(head, 5);
head = push(head, 4);
head = push(head, 3);
head = push(head, 2);
head = push(head, 1);
// k should be less than the
// numbers of nodes
var k = 3;
document.write("Given list<br>");
printList(head);
head = reverseKNodes(head, k);
document.write("<br>Modified list<br>");
printList(head);
 
</script>


Output:  

Given list
1 2 3 4 5 
Modified list
3 2 1 4 5 

Time Complexity: O(n) 
 Auxiliary Space: O(1)



Last Updated : 22 Sep, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads