O 03 zz linked list insertion at beginning hackerrank

Problem solution in Python programming.

#!/bin/python3 import math import os import random import re import sys class SinglyLinkedListNode: def __init__(self, node_data): self.data = node_data self.next = None class SinglyLinkedList: def __init__(self): self.head = None self.tail = None def insert_node(self, node_data): node = SinglyLinkedListNode(node_data) if not self.head: self.head = node else: self.tail.next = node self.tail = node def print_singly_linked_list(node, sep, fptr): while node: fptr.write(str(node.data)) node = node.next if node: fptr.write(sep) # Complete the insertNodeAtPosition function below. # # For your reference: # # SinglyLinkedListNode: # int data # SinglyLinkedListNode next # # class Node(object): def __init__(self, data=None, next_node=None): self.data = data self.next = next_node def insertNodeAtPosition(head, data, position): if position==0: head = Node(data,head) return head else: temp_head = head while position>1: temp_head = temp_head.next position = position -1 temp_head.next = Node(data,temp_head.next) return head if __name__ == '__main__': fptr = open(os.environ['OUTPUT_PATH'], 'w') llist_count = int(input()) llist = SinglyLinkedList() for _ in range(llist_count): llist_item = int(input()) llist.insert_node(llist_item) data = int(input()) position = int(input()) llist_head = insertNodeAtPosition(llist.head, data, position) print_singly_linked_list(llist_head, ' ', fptr) fptr.write('\n') fptr.close()





Inserting a node at the beginning of a linked list

The new node will be added at the beginning of a linked list.


Example

Assume that the linked list has elements: 20 30 40 NULL

If we insert 100, it will be added at the beginning of a linked list.

After insertion, the new linked list will be

100 20 30 40 NULL




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:

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

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




Time Complexity: O(N)

O 03 zz linked list insertion at beginning hackerrank




Article Tags :

Data Structures

Linked List

cpp-double-pointer

Practice Tags :

Data Structures

Linked List