 GFG App
Open App Browser
Continue

# Reverse first K elements of given linked list

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 ` `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

 ``

Output:

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

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

My Personal Notes arrow_drop_up