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


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.

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 postion
void insertPos(Node** current, int pos, int data)
{
    // This condition to check whether the
    // postion given is valid or not.
    if (pos < 1 || pos > size + 1)
        cout << "Invalid postion!" << endl;
    else {
  
        // Keep looping until the pos is zero
        while (pos--) {
  
            if (pos == 0) {
  
                // adding Node at required postion
                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);
  
    // insetion 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;
}

chevron_right


Output:

Linked list before insertion:  3 5 8 10
Linked list after insertion of 12 at position 3:  3 5 12 8 10
Linked list after insertion of 1 at position 1:  1 3 5 12 8 10
Linked list after insertion of 15 at position 7:  1 3 5 12 8 10 15

Time Complexity: O(N)



My Personal Notes arrow_drop_up

Problem solver, self learner, avid reader and chess lover )

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.