Squareroot(n)-th node in a Linked List
Last Updated :
25 Oct, 2022
Given a Linked List, write a function that accepts the head node of the linked list as a parameter and returns the value of node present at (floor(sqrt(n)))th position in the Linked List, where n is the length of the linked list or the total number of nodes in the list.
Examples:
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
Simple method: The simple method is to first find the total number of nodes present in the linked list, then find the value of floor(squareroot(n)) where n is the total number of nodes. Then traverse from the first node in the list to this position and return the node at this position.
This method traverses the linked list 2 times.
Optimized approach: In this method, we can get the required node by traversing the linked list once only. Below is the step by step algorithm for this approach.
- Initialize two counters i and j both to 1 and a pointer sqrtn to NULL to traverse till the required position is reached.
- Start traversing the list using head node until the last node is reached.
- While traversing check if the value of j is equal to sqrt(i). If the value is equal increment both i and j and sqrtn to point sqrtn->next otherwise increment only i.
- Now, when we will reach the last node of list i will contain value of n, j will contain value of sqrt(i) and sqrtn will point to node at jth position.
C++
#include <bits/stdc++.h>
using namespace std;
class Node
{
public :
int data;
Node* next;
};
int printsqrtn(Node* head)
{
Node* sqrtn = NULL;
int i = 1, j = 1;
while (head!=NULL)
{
if (i == j*j)
{
if (sqrtn == NULL)
sqrtn = head;
else
sqrtn = sqrtn->next;
j++;
}
i++;
head=head->next;
}
return sqrtn->data;
}
void print(Node* head)
{
while (head != NULL)
{
cout << head->data << " " ;
head = head->next;
}
cout<<endl;
}
void push(Node** head_ref, int new_data)
{
Node* new_node = new Node();
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
int main()
{
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;
}
|
C
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data;
struct Node* next;
};
int printsqrtn( struct Node* head)
{
struct Node* sqrtn = NULL;
int i = 1, j = 1;
while (head!=NULL)
{
if (i == j*j)
{
if (sqrtn == NULL)
sqrtn = head;
else
sqrtn = sqrtn->next;
j++;
}
i++;
head=head->next;
}
return sqrtn->data;
}
void print( struct Node* head)
{
while (head != NULL)
{
printf ( "%d " , head->data);
head = head->next;
}
printf ( "\n" );
}
void push( struct Node** head_ref, int new_data)
{
struct Node* new_node =
( struct Node*) malloc ( sizeof ( struct Node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
int main()
{
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
class GfG
{
static class Node
{
int data;
Node next;
}
static Node head = null ;
static int printsqrtn(Node head)
{
Node sqrtn = null ;
int i = 1 , j = 1 ;
while (head != null )
{
if (i == j * j)
{
if (sqrtn == null )
sqrtn = head;
else
sqrtn = sqrtn.next;
j++;
}
i++;
head=head.next;
}
return sqrtn.data;
}
static void print(Node head)
{
while (head != null )
{
System.out.print( head.data + " " );
head = head.next;
}
System.out.println();
}
static void push( int new_data)
{
Node new_node = new Node();
new_node.data = new_data;
new_node.next = head;
head = new_node;
}
public static void main(String[] args)
{
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));
}
}
|
Python3
class Node:
def __init__( self , data):
self .data = data
self . next = None
def printsqrtn(head) :
sqrtn = None
i = 1
j = 1
while (head ! = None ) :
if (i = = j * j) :
if (sqrtn = = None ) :
sqrtn = head
else :
sqrtn = sqrtn. next
j = j + 1
i = i + 1
head = head. next
return sqrtn.data
def print_1(head) :
while (head ! = None ) :
print ( head.data, end = " " )
head = head. next
print ( " " )
def push(head_ref, new_data) :
new_node = Node( 0 )
new_node.data = new_data
new_node. next = (head_ref)
(head_ref) = new_node
return head_ref
if __name__ = = '__main__' :
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))
|
C#
using System;
public class GfG
{
class Node
{
public int data;
public Node next;
}
static Node head = null ;
static int printsqrtn(Node head)
{
Node sqrtn = null ;
int i = 1, j = 1;
while (head != null )
{
if (i == j * j)
{
if (sqrtn == null )
sqrtn = head;
else
sqrtn = sqrtn.next;
j++;
}
i++;
head=head.next;
}
return sqrtn.data;
}
static void print(Node head)
{
while (head != null )
{
Console.Write( head.data + " " );
head = head.next;
}
Console.WriteLine();
}
static void push( int new_data)
{
Node new_node = new Node();
new_node.data = new_data;
new_node.next = head;
head = new_node;
}
public static void Main(String[] args)
{
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));
}
}
|
Javascript
<script>
class Node {
constructor(val) {
this .data = val;
this .next = null ;
}
}
var head = null ;
function printsqrtn(head) {
var sqrtn = null ;
var i = 1, j = 1;
while (head != null ) {
if (i == j * j) {
if (sqrtn == null )
sqrtn = head;
else
sqrtn = sqrtn.next;
j++;
}
i++;
head = head.next;
}
return sqrtn.data;
}
function print(head) {
while (head != null ) {
document.write(head.data + " " );
head = head.next;
}
document.write( "<br/>" );
}
function push(new_data) {
var new_node = new Node();
new_node.data = new_data;
new_node.next = head;
head = new_node;
}
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));
</script>
|
Output:
Given linked list is:10 20 30 40
sqrt(n)th node is 20
Complexity Analysis:
Time Complexity: O(n).
Space Complexity: O(1).
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...