Insert a node at a specific position in a linked list hackerrank solution python

Insert a node at a specific position in a linked list

Given a singly linked list, a position and an element, the task is to write a program to insert that element in a linked list at a given position.

Examples:

Insert a node at a specific position in a linked list hackerrank solution python

Input: 3->5->8->10, data = 2, position = 2 Output: 3->2->5->8->10 Input: 3->5->8->10, data = 11, position = 5 Output: 3->5->8->10->11
Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: To insert a given data at a specified position, the below algorithm is to be followed:

  • Traverse the Linked list upto position-1 nodes.
  • Once all the position-1 nodes are traversed, allocate memory and the given data to the new node.
  • Point the next pointer of the new node to the next of current node.
  • Point the next pointer of current node to the new node.

Below is the implementation of the above algorithm.




// C++ program for insertion in a single linked
// list at a specified position
#include <bits/stdc++.h>
using namespace std;
// A linked list Node
struct Node {
int data;
struct Node* next;
};
// Size of linked list
int size = 0;
// function to create and return a Node
Node* getNode(int data)
{
// allocating space
Node* newNode = new Node();
// inserting the required data
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// function to insert a Node at required position
void insertPos(Node** current, int pos, int data)
{
// This condition to check whether the
// position given is valid or not.
if (pos < 1 || pos > size + 1)
cout << "Invalid position!" << endl;
else {
// Keep looping until the pos is zero
while (pos--) {
if (pos == 0) {
// adding Node at required position
Node* temp = getNode(data);
// Making the new Node to point to
// the old Node at the same position
temp->next = *current;
// Changing the pointer of the Node previous
// to the old Node to point to the new Node
*current = temp;
}
else
// Assign double pointer variable to point to the
// pointer pointing to the address of next Node
current = &(*current)->next;
}
size++;
}
}
// This function prints contents
// of the linked list
void printList(struct Node* head)
{
while (head != NULL) {
cout << " " << head->data;
head = head->next;
}
cout << endl;
}
// Driver Code
int main()
{
// Creating the list 3->5->8->10
Node* head = NULL;
head = getNode(3);
head->next = getNode(5);
head->next->next = getNode(8);
head->next->next->next = getNode(10);
size = 4;
cout << "Linked list before insertion: ";
printList(head);
int data = 12, pos = 3;
insertPos(&head, pos, data);
cout << "Linked list after insertion of 12 at position 3: ";
printList(head);
// front of the linked list
data = 1, pos = 1;
insertPos(&head, pos, data);
cout << "Linked list after insertion of 1 at position 1: ";
printList(head);
// insertion at end of the linked list
data = 15, pos = 7;
insertPos(&head, pos, data);
cout << "Linked list after insertion of 15 at position 7: ";
printList(head);
return 0;
}




// Java program for insertion in a single linked
// list at a specified position
class GFG {
// A linked list Node
static class Node {
public int data;
public Node nextNode;
// inserting the required data
public Node(int data) {
this.data = data;
}
}
// function to create and return a Node
static Node GetNode(int data) {
return new Node(data);
}
// function to insert a Node at required position
static Node InsertPos(Node headNode, int position, int data) {
Node head = headNode;
if (position < 1)
System.out.print("Invalid position");
// if position is 1 then new node is
// set infornt of head node
// head node is changing.
if (position == 1) {
Node newNode = new Node(data);
newNode.nextNode = headNode;
head = newNode;
} else {
while (position-- != 0) {
if (position == 1) {
// adding Node at required position
Node newNode = GetNode(data);
// Making the new Node to point to
// the old Node at the same position
newNode.nextNode = headNode.nextNode;
// Replacing current with new Node
// to the old Node to point to the new Node
headNode.nextNode = newNode;
break;
}
headNode = headNode.nextNode;
}
if (position != 1)
System.out.print("Position out of range");
}
return head;
}
static void PrintList(Node node) {
while (node != null) {
System.out.print(node.data);
node = node.nextNode;
if (node != null)
System.out.print(",");
}
System.out.println();
}
// Driver code
public static void main(String[] args) {
Node head = GetNode(3);
head.nextNode = GetNode(5);
head.nextNode.nextNode = GetNode(8);
head.nextNode.nextNode.nextNode = GetNode(10);
System.out.print("Linked list before insertion: ");
PrintList(head);
int data = 12, pos = 3;
head = InsertPos(head, pos, data);
System.out.print("Linked list after" + " insertion of 12 at position 3: ");
PrintList(head);
// front of the linked list
data = 1;
pos = 1;
head = InsertPos(head, pos, data);
System.out.print("Linked list after" + "insertion of 1 at position 1: ");
PrintList(head);
// insertion at end of the linked list
data = 15;
pos = 7;
head = InsertPos(head, pos, data);
System.out.print("Linked list after" + " insertion of 15 at position 7: ");
PrintList(head);
}
}
// This code is contributed by Rajput-Ji




# Python3 program for insertion in a single linked
# list at a specified position
# A linked list Node
class Node:
def __init__(self, data):
self.data = data
self.nextNode = None
# function to create and return a Node
def getNode(data):
# allocating space
newNode = Node(data)
return newNode;
# function to insert a Node at required position
def insertPos(headNode, position, data):
head = headNode
# This condition to check whether the
# position given is valid or not.
if (position < 1):
print("Invalid position!")
if position == 1:
newNode = Node(data)
newNode.nextNode = headNode
head = newNode
else:
# Keep looping until the position is zero
while (position != 0):
position -= 1
if (position == 1):
# adding Node at required position
newNode = getNode(data)
# Making the new Node to point to
# the old Node at the same position
newNode.nextNode = headNode.nextNode
# Replacing headNode with new Node
# to the old Node to point to the new Node
headNode.nextNode = newNode
break
headNode = headNode.nextNode
if headNode == None:
break
if position != 1:
print("position out of range")
return head
# This function prints contents
# of the linked list
def printList(head):
while (head != None):
print(' ' + str(head.data), end = '')
head = head.nextNode;
print()
# Driver Code
if __name__=='__main__':
# Creating the list 3.5.8.10
head = getNode(3);
head.nextNode = getNode(5);
head.nextNode.nextNode = getNode(8);
head.nextNode.nextNode.nextNode = getNode(10);
print("Linked list before insertion: ", end='')
printList(head);
data = 12
position = 3;
head = insertPos(head, position, data);
print("Linked list after insertion of 12 at position 3: ", end = '')
printList(head);
# front of the linked list
data = 1
position = 1;
head = insertPos(head, position, data);
print("Linked list after insertion of 1 at position 1: ", end = '')
printList(head);
# insertion at end of the linked list
data = 15
position = 7;
head = insertPos(head, position, data);
print("Linked list after insertion of 15 at position 7: ", end='')
printList(head);
# This code iscontributed by rutvik_56




// C# program for insertion in a single linked
// list at a specified position
using System;
namespace InsertIntoLinkedList
{
class Program
{
// A linked list Node
private class Node
{
public int data;
public Node nextNode;
// inserting the required data
public Node(int data) => this.data = data;
}
// function to create and return a Node
static Node GetNode(int data) => new Node(data);
// function to insert a Node at required position
static Node InsertPos(Node headNode,
int position, int data)
{
var head = headNode;
if (position < 1)
Console.WriteLine("Invalid position");
//if position is 1 then new node is
// set infornt of head node
//head node is changing.
if (position == 1)
{
var newNode = new Node(data);
newNode.nextNode = headNode;
head = newNode;
}
else
{
while (position-- != 0)
{
if (position == 1)
{
// adding Node at required position
Node newNode = GetNode(data);
// Making the new Node to point to
// the old Node at the same position
newNode.nextNode = headNode.nextNode;
// Replacing current with new Node
// to the old Node to point to the new Node
headNode.nextNode = newNode;
break;
}
headNode = headNode.nextNode;
}
if (position != 1)
Console.WriteLine("Position out of range");
}
return head;
}
static void PrintList(Node node)
{
while (node != null)
{
Console.Write(node.data);
node = node.nextNode;
if(node != null)
Console.Write(",");
}
Console.WriteLine();
}
// Driver code
static void Main(string[] args)
{
var head = GetNode(3);
head.nextNode = GetNode(5);
head.nextNode.nextNode = GetNode(8);
head.nextNode.nextNode.nextNode = GetNode(10);
Console.WriteLine("Linked list before insertion: ");
PrintList(head);
int data = 12, pos = 3;
head = InsertPos(head, pos, data);
Console.WriteLine("Linked list after" +
" insertion of 12 at position 3: ");
PrintList(head);
// front of the linked list
data = 1; pos = 1;
head = InsertPos(head, pos, data);
Console.WriteLine("Linked list after" +
"insertion of 1 at position 1: ");
PrintList(head);
// insertion at end of the linked list
data = 15; pos = 7;
head = InsertPos(head, pos, data);
Console.WriteLine("Linked list after" +
" insertion of 15 at position 7: ");
PrintList(head);
}
}
}
// This code is contributed by dhirucoool




<script>
// javascript program for insertion in a single linked
// list at a specified position // A linked list Node
class Node {
// inserting the required data
constructor(val) {
this.data = val;
this.nextNode = null;
}
}
// function to create and return a Node
function GetNode(data) {
return new Node(data);
}
// function to insert a Node at required position
function InsertPos( headNode , position , data) {
head = headNode;
if (position < 1)
document.write("Invalid position");
// if position is 1 then new node is
// set infront of head node
// head node is changing.
if (position == 1) {
newNode = new Node(data);
newNode.nextNode = headNode;
head = newNode;
}
else
{
while (position-- != 0)
{
if (position == 1)
{
// adding Node at required position
newNode = GetNode(data);
// Making the new Node to point to
// the old Node at the same position
newNode.nextNode = headNode.nextNode;
// Replacing current with new Node
// to the old Node to point to the new Node
headNode.nextNode = newNode;
break;
}
headNode = headNode.nextNode;
}
if (position != 1)
document.write("Position out of range");
}
return head;
}
function PrintList( node) {
while (node != null) {
document.write(node.data);
node = node.nextNode;
if (node != null)
document.write(",");
}
document.write("<br/>");
}
// Driver code
head = GetNode(3);
head.nextNode = GetNode(5);
head.nextNode.nextNode = GetNode(8);
head.nextNode.nextNode.nextNode = GetNode(10);
document.write("Linked list before insertion: ");
PrintList(head);
var data = 12, pos = 3;
head = InsertPos(head, pos, data);
document.write("Linked list after" + " insertion of 12 at position 3: ");
PrintList(head);
// front of the linked list
data = 1;
pos = 1;
head = InsertPos(head, pos, data);
document.write("Linked list after" + "insertion of 1 at position 1: ");
PrintList(head);
// insertion at end of the linked list
data = 15;
pos = 7;
head = InsertPos(head, pos, data);
document.write("Linked list after" + " insertion of 15 at position 7: ");
PrintList(head);
// This code is contributed by gauravrajput1.
</script>

Time Complexity: O(N)




Article Tags :
Data Structures
Linked List
cpp-double-pointer
Practice Tags :
Data Structures
Linked List