Squareroot(n)-th Node en una lista enlazada

Dada una lista enlazada, escriba una función que acepte el Node principal de la lista enlazada como parámetro y devuelva el valor del Node presente en (piso(sqrt(n)))ésima posición en la lista enlazada, donde n es la longitud de la lista enlazada o el número total de Nodes en la lista. 
Ejemplos: 
 

Input: 1->2->3->4->5->NULL
Output: 2

Input : 10->20->30->40->NULL
Output : 20

Input : 10->20->30->40->50->60->70->80->90->NULL
Output : 30

Método simple : el método simple es encontrar primero el número total de Nodes presentes en la lista enlazada, luego encontrar el valor de piso (raíz cuadrada (n)) donde n es el número total de Nodes. A continuación, recorra desde el primer Node de la lista hasta esta posición y devuelva el Node a esta posición. 
Este método atraviesa la lista enlazada 2 veces.
Enfoque optimizado : en este método, podemos obtener el Node requerido al recorrer la lista vinculada una sola vez. A continuación se muestra el algoritmo paso a paso para este enfoque. 
 

  1. Inicialice dos contadores i y j ambos a 1 y un puntero sqrtn a NULL para recorrer hasta alcanzar la posición requerida.
  2. Comience a recorrer la lista usando el Node principal hasta llegar al último Node.
  3. Mientras atraviesa, verifique si el valor de j es igual a sqrt (i). Si el valor es igual, incremente tanto i como j y sqrtn hasta el punto sqrtn->siguiente; de ​​lo contrario, incremente solo i.
  4. Ahora, cuando alcancemos el último Node de la lista, contendrá el valor de n, j contendrá el valor de sqrt (i) y sqrtn apuntará al Node en la posición j-ésima. 
     

C++

// C++ program to find sqrt(n)'th node
// of a linked list
 
#include <bits/stdc++.h>
using namespace std;
 
// Linked list node
class Node
{
    public:
    int data;
    Node* next;
};
 
// Function to get the sqrt(n)th
// node of a linked list
int printsqrtn(Node* head)
{
    Node* sqrtn = NULL;
    int i = 1, j = 1;
     
    // Traverse the list
    while (head!=NULL)
    {
        // check if j = sqrt(i)
        if (i == j*j)
        {
            // for first node
            if (sqrtn == NULL)
                sqrtn = head;
            else
                sqrtn = sqrtn->next;
             
            // increment j if j = sqrt(i)
            j++;
        }
        i++;
         
        head=head->next;
    }
     
    // return node's data
    return sqrtn->data;
}
 
void print(Node* head)
{
    while (head != NULL)
    {
        cout << head->data << " ";
        head = head->next;
    }
    cout<<endl;
}
 
// function to add a new node at the
// beginning of the list
void push(Node** head_ref, int new_data)
{
    // allocate node
    Node* new_node = new Node();
     
    // put in the data
    new_node->data = new_data;
     
    // link the old list off the new node
    new_node->next = (*head_ref);
     
    // move the head to point to the new node
    (*head_ref) = new_node;
}
 
/* Driver program to test above function*/
int main()
{
    /* Start with the empty list */
    Node* head = NULL;
    push(&head, 40);
    push(&head, 30);
    push(&head, 20);
    push(&head, 10);
    cout << "Given linked list is:";
    print(head);
    cout << "sqrt(n)th node is " << printsqrtn(head);
     
    return 0;
}
 
// This is code is contributed by rathbhupendra

C

// C program to find sqrt(n)'th node
// of a linked list
 
#include<stdio.h>
#include<stdlib.h>
 
// Linked list node
struct Node
{
    int data;
    struct Node* next;
};
 
// Function to get the sqrt(n)th
// node of a linked list
int printsqrtn(struct Node* head)
{
    struct Node* sqrtn = NULL;
    int i = 1, j = 1;
     
    // Traverse the list
    while (head!=NULL)
    {  
        // check if j = sqrt(i)
        if (i == j*j)
        {  
            // for first node
            if (sqrtn == NULL)
                sqrtn = head;
            else
                sqrtn = sqrtn->next;
             
            // increment j if j = sqrt(i)   
            j++;
        }
        i++;
         
        head=head->next;
    }
     
    // return node's data
    return sqrtn->data;
}
 
void print(struct Node* head)
{
    while (head != NULL)
    {
        printf("%d ", head->data);
        head = head->next;
    }
    printf("\n");
}
 
// function to add a new node at the
// beginning of the list
void push(struct Node** head_ref, int new_data)
{
    // allocate node
    struct Node* new_node =
            (struct Node*) malloc(sizeof(struct Node));
     
    // put in the data
    new_node->data = new_data;
     
    // link the old list off the new node
    new_node->next = (*head_ref);
     
    // move the head to point to the new node
    (*head_ref) = new_node;
}
 
/* Driver program to test above function*/
int main()
{
    /* Start with the empty list */
    struct Node* head = NULL;
    push(&head, 40);
    push(&head, 30);
    push(&head, 20);
    push(&head, 10);
    printf("Given linked list is:");
    print(head);
    printf("sqrt(n)th node is %d ",printsqrtn(head));
     
    return 0;
}

Java

// Java program to find sqrt(n)'th node
// of a linked list
 
class GfG
{
 
// Linked list node
static class Node
{
    int data;
    Node next;
}
static Node head = null;
 
// Function to get the sqrt(n)th
// node of a linked list
static int printsqrtn(Node head)
{
    Node sqrtn = null;
    int i = 1, j = 1;
     
    // Traverse the list
    while (head != null)
    {
        // check if j = sqrt(i)
        if (i == j * j)
        {
            // for first node
            if (sqrtn == null)
                sqrtn = head;
            else
                sqrtn = sqrtn.next;
             
            // increment j if j = sqrt(i)
            j++;
        }
        i++;
         
        head=head.next;
    }
     
    // return node's data
    return sqrtn.data;
}
 
static void print(Node head)
{
    while (head != null)
    {
        System.out.print( head.data + " ");
        head = head.next;
    }
    System.out.println();
}
 
// function to add a new node at the
// beginning of the list
static void push( int new_data)
{
    // allocate node
    Node new_node = new Node();
     
    // put in the data
    new_node.data = new_data;
     
    // link the old list off the new node
    new_node.next = head;
     
    // move the head to point to the new node
    head = new_node;
}
 
/* Driver code*/
public static void main(String[] args)
{
    /* Start with the empty list */
    push( 40);
    push( 30);
    push( 20);
    push( 10);
    System.out.print("Given linked list is:");
    print(head);
    System.out.print("sqrt(n)th node is " +
                        printsqrtn(head));
}
}
 
// This code is contributed by prerna saini

Python3

# Python3 program to find sqrt(n)'th node
# of a linked list
 
# Node class
class Node:
 
    # Function to initialise the node object
    def __init__(self, data):
        self.data = data
        self.next = None
 
# Function to get the sqrt(n)th
# node of a linked list
def printsqrtn(head) :
 
    sqrtn = None
    i = 1
    j = 1
     
    # Traverse the list
    while (head != None) :
     
        # check if j = sqrt(i)
        if (i == j * j) :
         
            # for first node
            if (sqrtn == None) :
                sqrtn = head
            else:
                sqrtn = sqrtn.next
             
            # increment j if j = sqrt(i)
            j = j + 1
         
        i = i + 1
         
        head = head.next
     
    # return node's data
    return sqrtn.data
 
def print_1(head) :
 
    while (head != None) :
        print( head.data, end = " ")
        head = head.next
    print(" ")
 
# function to add a new node at the
# beginning of the list
def push(head_ref, new_data) :
 
    # allocate node
    new_node = Node(0)
     
    # put in the data
    new_node.data = new_data
     
    # link the old list off the new node
    new_node.next = (head_ref)
     
    # move the head to point to the new node
    (head_ref) = new_node
    return head_ref
 
# Driver Code
if __name__=='__main__':
 
    # Start with the empty list
    head = None
    head = push(head, 40)
    head = push(head, 30)
    head = push(head, 20)
    head = push(head, 10)
    print("Given linked list is:")
    print_1(head)
    print("sqrt(n)th node is ",
              printsqrtn(head))
     
# This code is contributed by Arnab Kundu

C#

// C# program to find sqrt(n)'th node
// of a linked list
using System;
public class GfG
{
 
// Linked list node
class Node
{
    public int data;
    public Node next;
}
static Node head = null;
 
// Function to get the sqrt(n)th
// node of a linked list
static int printsqrtn(Node head)
{
    Node sqrtn = null;
    int i = 1, j = 1;
     
    // Traverse the list
    while (head != null)
    {
        // check if j = sqrt(i)
        if (i == j * j)
        {
            // for first node
            if (sqrtn == null)
                sqrtn = head;
            else
                sqrtn = sqrtn.next;
             
            // increment j if j = sqrt(i)
            j++;
        }
        i++;
         
        head=head.next;
    }
     
    // return node's data
    return sqrtn.data;
}
 
static void print(Node head)
{
    while (head != null)
    {
        Console.Write( head.data + " ");
        head = head.next;
    }
    Console.WriteLine();
}
 
// function to add a new node at the
// beginning of the list
static void push( int new_data)
{
    // allocate node
    Node new_node = new Node();
     
    // put in the data
    new_node.data = new_data;
     
    // link the old list off the new node
    new_node.next = head;
     
    // move the head to point to the new node
    head = new_node;
}
 
/* Driver code*/
public static void Main(String[] args)
{
    /* Start with the empty list */
    push( 40);
    push( 30);
    push( 20);
    push( 10);
    Console.Write("Given linked list is:");
    print(head);
    Console.Write("sqrt(n)th node is " +
                        printsqrtn(head));
}
}
 
/* This code is contributed by 29AjayKumar */

Javascript

<script>
 
// JavaScript program to find sqrt(n)'th node
// of a linked list
 
 
    // Linked list node
    class Node {
        constructor(val) {
            this.data = val;
            this.next = null;
        }
    }
    var head = null;
 
    // Function to get the sqrt(n)th
    // node of a linked list
    function printsqrtn(head) {
    var sqrtn = null;
        var i = 1, j = 1;
 
        // Traverse the list
        while (head != null) {
            // check if j = sqrt(i)
            if (i == j * j) {
                // for first node
                if (sqrtn == null)
                    sqrtn = head;
                else
                    sqrtn = sqrtn.next;
 
                // increment j if j = sqrt(i)
                j++;
            }
            i++;
 
            head = head.next;
        }
 
        // return node's data
        return sqrtn.data;
    }
 
    function print(head) {
        while (head != null) {
            document.write(head.data + " ");
            head = head.next;
        }
        document.write("<br/>");
    }
 
    // function to add a new node at the
    // beginning of the list
    function push(new_data) {
        // allocate node
        var new_node = new Node();
 
        // put in the data
        new_node.data = new_data;
 
        // link the old list off the new node
        new_node.next = head;
 
        // move the head to point to the new node
        head = new_node;
    }
 
    /* Driver code */
     
        /* Start with the empty list */
        push(40);
        push(30);
        push(20);
        push(10);
        document.write("Given linked list is:");
        print(head);
        document.write("sqrt(n)th node is " + printsqrtn(head));
 
// This code contributed by Rajput-Ji
 
</script>

Producción:  

Given linked list is:10 20 30 40
sqrt(n)th node is 20

Análisis de Complejidad:

Complejidad temporal: O(n).

Complejidad espacial: O(1).

Este artículo es una contribución de Akshit Agarwal . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a contribuido@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *