Insertar un Node en una posición específica en una lista vinculada

Dada una lista enlazada, una posición y un elemento, la tarea es escribir un programa para insertar ese elemento en una lista enlazada en una posición dada. 

Ejemplos: 

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 

Complete Interview Preparation - GFG

Enfoque: para insertar un dato dado en una posición específica, se debe seguir el siguiente algoritmo:  

  • Atraviese la lista Vinculada hasta los Nodes de posición 1 .
  • Una vez que se recorren todos los Nodes de la posición 1 , asigne memoria y los datos proporcionados al nuevo Node.
  • Apunte el siguiente puntero del nuevo Node al siguiente del Node actual.
  • Apunte el siguiente puntero del Node actual al nuevo Node.

A continuación se muestra la implementación del algoritmo anterior. 

C++

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

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

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

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

Javascript

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

Complejidad de tiempo: O(N)
 

Publicación traducida automáticamente

Artículo escrito por Prasoon_Mishra y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *