Replace every node in a linked list with its closest bell number
Last Updated :
30 Nov, 2023
Given a singly linked list, the task is to replace every node with its closest bell number.
Bell numbers are a sequence of numbers that represent the number of partitions of a set. In other words, given a set of n elements, the Bell number for n represents the total number of distinct ways that the set can be partitioned into subsets.
The first few Bell numbers are 1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, …
Examples:
Input: 14 -> 7 -> 190 -> 2 -> 5 -> NULL
Output: 15 -> 5 -> 203 -> 2 -> 5 -> NULL
Explanation: The closest Bell numbers for each node are:
- Node 1 (value = 14): Closest Bell number = 15.
- Node 2 (value = 7): Closest Bell number = 5.
- Node 3 (value = 190): Closest Bell number = 203.
- Node 4 (value = 2): Closest Bell number = 2.
- Node 5 (value = 5): Closest Bell number = 5.
Input: 50 -> 1 -> 4 -> NULL
Output: 52 -> 1 -> 5 -> NULL
Explanation: The closest Bell numbers for each node are:
- Node 1 (value = 50): Closest Bell number = 52.
- Node 1 (value = 1): Closest Bell number = 1.
- Node 1 (value = 4): Closest Bell number = 5.
Approach: This can be solved with the following idea:
The algorithm first calculates the Bell number at a given index by filling a 2D array using a dynamic programming approach. Then, it finds the closest Bell number to a given node value by iterating through the Bell numbers until it finds a Bell number greater than or equal to the node value. It then compares the difference between the previous and current Bell numbers to determine which one is closer to the node value. Finally, it replaces each node in the linked list with its closest Bell number using a while loop that iterates through each node in the linked list.
Steps of the above approach:
- Define a bellNumber function that takes an integer n as an argument and returns the nth Bell number. The function uses dynamic programming to calculate the Bell number.
- Define a closestBell function that takes an integer n as an argument and returns the closest Bell number to n.
- This function iteratively calls the bellNumber function until it finds the smallest Bell number greater than or equal to n.
- If n is less than the first Bell number (which is 1), then the function returns the first Bell number. Otherwise, the function compares the difference between n and the previous Bell number to the difference between the next Bell number and n and returns the closer Bell number.
- Define a replaceWithBell function that takes the head of a linked list as an argument and replaces the data value of each node in the list with the closest Bell number to its original data value.
- The function iterates through each node in the list, calls the closestBell function to find the closest Bell number to the node’s original data value, and assigns that value to the node’s data field.
Below is the implementation of the above approach:
C++
#include <cmath>
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
};
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;
}
void printList(Node* node)
{
while (node != NULL) {
cout << node->data;
if (node->next != NULL) {
cout << " -> " ;
}
node = node->next;
}
}
int bellNumber( int n)
{
int bell[n + 1][n + 1];
bell[0][0] = 1;
for ( int i = 1; i <= n; i++) {
bell[i][0] = bell[i - 1][i - 1];
for ( int j = 1; j <= i; j++) {
bell[i][j]
= bell[i - 1][j - 1] + bell[i][j - 1];
}
}
return bell[n][0];
}
int closestBell( int n)
{
int bellNum = 0;
while (bellNumber(bellNum) < n) {
bellNum++;
}
if (bellNum == 0) {
return bellNumber(bellNum);
}
else {
int prev = bellNumber(bellNum - 1);
int curr = bellNumber(bellNum);
return (n - prev < curr - n) ? prev : curr;
}
}
void replaceWithBell(Node* node)
{
while (node != NULL) {
node->data = closestBell(node->data);
node = node->next;
}
}
int main()
{
Node* head = NULL;
push(&head, 5);
push(&head, 2);
push(&head, 190);
push(&head, 7);
push(&head, 14);
replaceWithBell(head);
printList(head);
return 0;
}
|
Java
class GFG {
static class Node {
int data;
Node next;
Node( int data) {
this .data = data;
this .next = null ;
}
}
static void push(Node[] head_ref, int newData) {
Node newNode = new Node(newData);
newNode.next = head_ref[ 0 ];
head_ref[ 0 ] = newNode;
}
static void printList(Node node) {
while (node != null ) {
System.out.print(node.data);
if (node.next != null ) {
System.out.print( " -> " );
}
node = node.next;
}
}
static int bellNumber( int n) {
int [][] bell = new int [n + 1 ][n + 1 ];
bell[ 0 ][ 0 ] = 1 ;
for ( int i = 1 ; i <= n; i++) {
bell[i][ 0 ] = bell[i - 1 ][i - 1 ];
for ( int j = 1 ; j <= i; j++) {
bell[i][j] = bell[i - 1 ][j - 1 ] + bell[i][j - 1 ];
}
}
return bell[n][ 0 ];
}
static int closestBell( int n) {
int bellNum = 0 ;
while (bellNumber(bellNum) < n) {
bellNum++;
}
if (bellNum == 0 ) {
return bellNumber(bellNum);
} else {
int prev = bellNumber(bellNum - 1 );
int curr = bellNumber(bellNum);
return (n - prev < curr - n) ? prev : curr;
}
}
static void replaceWithBell(Node node) {
while (node != null ) {
node.data = closestBell(node.data);
node = node.next;
}
}
public static void main(String[] args) {
Node[] head = new Node[ 1 ];
push(head, 5 );
push(head, 2 );
push(head, 190 );
push(head, 7 );
push(head, 14 );
replaceWithBell(head[ 0 ]);
printList(head[ 0 ]);
}
}
|
Python3
import math
class Node:
def __init__( self , data):
self .data = data
self . next = None
def push(head_ref, new_data):
new_node = Node(new_data)
new_node. next = head_ref
head_ref = new_node
return head_ref
def printList(node):
while node is not None :
print (node.data, end = "")
if node. next is not None :
print ( " -> " , end = "")
node = node. next
print ()
def bellNumber(n):
bell = [[ 0 for _ in range (n + 1 )] for _ in range (n + 1 )]
bell[ 0 ][ 0 ] = 1
for i in range ( 1 , n + 1 ):
bell[i][ 0 ] = bell[i - 1 ][i - 1 ]
for j in range ( 1 , i + 1 ):
bell[i][j] = bell[i - 1 ][j - 1 ] + bell[i][j - 1 ]
return bell[n][ 0 ]
def closestBell(n):
bellNum = 0
while bellNumber(bellNum) < n:
bellNum + = 1
if bellNum = = 0 :
return bellNumber(bellNum)
else :
prev = bellNumber(bellNum - 1 )
curr = bellNumber(bellNum)
return prev if n - prev < curr - n else curr
def replaceWithBell(node):
while node is not None :
node.data = closestBell(node.data)
node = node. next
if __name__ = = "__main__" :
head = None
head = push(head, 5 )
head = push(head, 2 )
head = push(head, 190 )
head = push(head, 7 )
head = push(head, 14 )
replaceWithBell(head)
printList(head)
|
C#
using System;
class Node
{
public int data;
public Node next;
public Node( int data)
{
this .data = data;
this .next = null ;
}
}
class GFG
{
static Node Push(Node head_ref, int new_data)
{
Node new_node = new Node(new_data);
new_node.next = head_ref;
head_ref = new_node;
return head_ref;
}
static void PrintList(Node node)
{
while (node != null )
{
Console.Write(node.data);
if (node.next != null )
{
Console.Write( " -> " );
}
node = node.next;
}
Console.WriteLine();
}
static int BellNumber( int n)
{
int [][] bell = new int [n + 1][];
for ( int i = 0; i <= n; i++)
{
bell[i] = new int [n + 1];
}
bell[0][0] = 1;
for ( int i = 1; i <= n; i++)
{
bell[i][0] = bell[i - 1][i - 1];
for ( int j = 1; j <= i; j++)
{
bell[i][j] = bell[i - 1][j - 1] + bell[i][j - 1];
}
}
return bell[n][0];
}
static int ClosestBell( int n)
{
int bellNum = 0;
while (BellNumber(bellNum) < n)
{
bellNum++;
}
if (bellNum == 0)
{
return BellNumber(bellNum);
}
else
{
int prev = BellNumber(bellNum - 1);
int curr = BellNumber(bellNum);
return (n - prev < curr - n) ? prev : curr;
}
}
static void ReplaceWithBell(Node node)
{
while (node != null )
{
node.data = ClosestBell(node.data);
node = node.next;
}
}
static void Main()
{
Node head = null ;
head = Push(head, 5);
head = Push(head, 2);
head = Push(head, 190);
head = Push(head, 7);
head = Push(head, 14);
ReplaceWithBell(head);
PrintList(head);
}
}
|
Javascript
function Node(data) {
this .data = data;
this .next = null ;
}
function push(head_ref, new_data) {
var new_node = new Node(new_data);
new_node.next = head_ref;
head_ref = new_node;
return head_ref;
}
function printList(node) {
while (node != null ) {
console.log(node.data + " " );
if (node.next != null ) {
console.log( "-> " );
}
node = node.next;
}
}
function bellNumber(n) {
var bell = [];
for ( var i = 0; i <= n; i++) {
bell[i] = [];
for ( var j = 0; j <= n; j++) {
bell[i][j] = 0;
}
}
bell[0][0] = 1;
for ( var i = 1; i <= n; i++) {
bell[i][0] = bell[i - 1][i - 1];
for ( var j = 1; j <= i; j++) {
bell[i][j] = bell[i - 1][j - 1] + bell[i][j - 1];
}
}
return bell[n][0];
}
function closestBell(n) {
var bellNum = 0;
while (bellNumber(bellNum) < n) {
bellNum += 1;
}
if (bellNum == 0) {
return bellNumber(bellNum);
} else {
var prev = bellNumber(bellNum - 1);
var curr = bellNumber(bellNum);
return n - prev < curr - n ? prev : curr;
}
}
function replaceWithBell(node) {
while (node != null ) {
node.data = closestBell(node.data);
node = node.next;
}
}
var head = null ;
head = push(head, 5);
head = push(head, 2);
head = push(head, 190);
head = push(head, 7);
head = push(head, 14);
replaceWithBell(head);
printList(head);
|
Output
15 -> 5 -> 203 -> 2 -> 5
Time Complexity: O(n3)
Auxiliary Space: O(n2)
Efficient approach: Space Optimized solution O(N)
In previous approach we are using 2D array to store the computations of subproblems but the current value is only dependent on the current and previous row of matrix so in this approach we are using 2 vector to store the current and previous rows of matrix.
Implementation steps:
- Initialize 2 vectors curr and prev of size N to store the current and previous rows of matrix.
- Now initialize the base case for n=0.
- Now iterate over subproblems to get the current value from previous computations.
- After every iteration assign values of prev to curr vector.
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node* next;
};
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;
}
void printList(Node* node)
{
while (node != NULL) {
cout << node->data;
if (node->next != NULL) {
cout << " -> " ;
}
node = node->next;
}
}
int bellNumber( int n)
{
vector< int >curr(n + 1 , 0);
vector< int >prev(n + 1 , 0);
curr[0] = 1;
prev[0] = 1;
for ( int i = 1; i <= n; i++) {
curr[0] = prev[i - 1];
for ( int j = 1; j <= i; j++) {
curr[j]
= prev[j - 1] + curr[j - 1];
}
prev= curr;
}
return curr[0];
}
int closestBell( int n)
{
int bellNum = 0;
while (bellNumber(bellNum) < n) {
bellNum++;
}
if (bellNum == 0) {
return bellNumber(bellNum);
}
else {
int prev = bellNumber(bellNum - 1);
int curr = bellNumber(bellNum);
return (n - prev < curr - n) ? prev : curr;
}
}
void replaceWithBell(Node* node)
{
while (node != NULL) {
node->data = closestBell(node->data);
node = node->next;
}
}
int main()
{
Node* head = NULL;
push(&head, 5);
push(&head, 2);
push(&head, 190);
push(&head, 7);
push(&head, 14);
replaceWithBell(head);
printList(head);
return 0;
}
|
Java
import java.util.Arrays;
class Node {
int data;
Node next;
Node( int data) {
this .data = data;
this .next = null ;
}
}
public class Main {
static Node push(Node head, int new_data) {
Node new_node = new Node(new_data);
new_node.next = head;
return new_node;
}
static void printList(Node node) {
while (node != null ) {
System.out.print(node.data);
if (node.next != null ) {
System.out.print( " -> " );
}
node = node.next;
}
}
static int bellNumber( int n) {
int [] curr = new int [n + 1 ];
int [] prev = new int [n + 1 ];
curr[ 0 ] = 1 ;
prev[ 0 ] = 1 ;
for ( int i = 1 ; i <= n; i++) {
curr[ 0 ] = prev[i - 1 ];
for ( int j = 1 ; j <= i; j++) {
curr[j] = prev[j - 1 ] + curr[j - 1 ];
}
prev = Arrays.copyOf(curr, curr.length);
}
return curr[ 0 ];
}
static int closestBell( int n) {
int bellNum = 0 ;
while (bellNumber(bellNum) < n) {
bellNum++;
}
if (bellNum == 0 ) {
return bellNumber(bellNum);
} else {
int prev = bellNumber(bellNum - 1 );
int curr = bellNumber(bellNum);
return (n - prev < curr - n) ? prev : curr;
}
}
static void replaceWithBell(Node head) {
Node current = head;
while (current != null ) {
current.data = closestBell(current.data);
current = current.next;
}
}
public static void main(String[] args) {
Node head = null ;
head = push(head, 5 );
head = push(head, 2 );
head = push(head, 190 );
head = push(head, 7 );
head = push(head, 14 );
replaceWithBell(head);
printList(head);
}
}
|
Python3
class Node:
def __init__( self , data):
self .data = data
self . next = None
def push(head_ref, new_data):
new_node = Node(new_data)
new_node. next = head_ref[ 0 ]
head_ref[ 0 ] = new_node
def printList(node):
while node is not None :
print (node.data, end = "")
if node. next is not None :
print ( " -> " , end = "")
node = node. next
def bellNumber(n):
curr = [ 0 ] * (n + 1 )
prev = [ 0 ] * (n + 1 )
curr[ 0 ] = 1
prev[ 0 ] = 1
for i in range ( 1 , n + 1 ):
curr[ 0 ] = prev[i - 1 ]
for j in range ( 1 , i + 1 ):
curr[j] = prev[j - 1 ] + curr[j - 1 ]
prev = curr[:]
return curr[ 0 ]
def closestBell(n):
bellNum = 0
while bellNumber(bellNum) < n:
bellNum + = 1
if bellNum = = 0 :
return bellNumber(bellNum)
else :
prev = bellNumber(bellNum - 1 )
curr = bellNumber(bellNum)
return prev if (n - prev < curr - n) else curr
def replaceWithBell(node):
while node is not None :
node.data = closestBell(node.data)
node = node. next
if __name__ = = "__main__" :
head = [ None ]
push(head, 5 )
push(head, 2 )
push(head, 190 )
push(head, 7 )
push(head, 14 )
replaceWithBell(head[ 0 ])
printList(head[ 0 ])
|
C#
using System;
class Node
{
public int Data;
public Node Next;
public Node( int data)
{
Data = data;
Next = null ;
}
}
class MainClass
{
static Node Push(Node head, int new_data)
{
Node new_node = new Node(new_data);
new_node.Next = head;
return new_node;
}
static void PrintList(Node node)
{
while (node != null )
{
Console.Write(node.Data);
if (node.Next != null )
{
Console.Write( " -> " );
}
node = node.Next;
}
}
static int BellNumber( int n)
{
int [] curr = new int [n + 1];
int [] prev = new int [n + 1];
curr[0] = 1;
prev[0] = 1;
for ( int i = 1; i <= n; i++)
{
curr[0] = prev[i - 1];
for ( int j = 1; j <= i; j++)
{
curr[j] = prev[j - 1] + curr[j - 1];
}
prev = ( int [])curr.Clone();
}
return curr[0];
}
static int ClosestBell( int n)
{
int bellNum = 0;
while (BellNumber(bellNum) < n)
{
bellNum++;
}
if (bellNum == 0)
{
return BellNumber(bellNum);
}
else
{
int prev = BellNumber(bellNum - 1);
int curr = BellNumber(bellNum);
return (n - prev < curr - n) ? prev : curr;
}
}
static void ReplaceWithBell(Node head)
{
Node current = head;
while (current != null )
{
current.Data = ClosestBell(current.Data);
current = current.Next;
}
}
public static void Main( string [] args)
{
Node head = null ;
head = Push(head, 5);
head = Push(head, 2);
head = Push(head, 190);
head = Push(head, 7);
head = Push(head, 14);
ReplaceWithBell(head);
PrintList(head);
}
}
|
Javascript
class Node {
constructor(data) {
this .data = data;
this .next = null ;
}
}
function push(head, new_data) {
const new_node = new Node(new_data);
new_node.next = head;
return new_node;
}
function printList(node) {
while (node !== null ) {
console.log(node.data);
if (node.next !== null ) {
console.log( " -> " );
}
node = node.next;
}
}
function bellNumber(n) {
const curr = new Array(n + 1).fill(0);
const prev = new Array(n + 1).fill(0);
curr[0] = 1;
prev[0] = 1;
for (let i = 1; i <= n; i++) {
curr[0] = prev[i - 1];
for (let j = 1; j <= i; j++) {
curr[j] = prev[j - 1] + curr[j - 1];
}
for (let k = 0; k < curr.length; k++) {
prev[k] = curr[k];
}
}
return curr[0];
}
function closestBell(n) {
let bellNum = 0;
while (bellNumber(bellNum) < n) {
bellNum++;
}
if (bellNum === 0) {
return bellNumber(bellNum);
} else {
const prev = bellNumber(bellNum - 1);
const curr = bellNumber(bellNum);
return (n - prev < curr - n) ? prev : curr;
}
}
function replaceWithBell(head) {
let current = head;
while (current !== null ) {
current.data = closestBell(current.data);
current = current.next;
}
}
let head = null ;
head = push(head, 5);
head = push(head, 2);
head = push(head, 190);
head = push(head, 7);
head = push(head, 14);
replaceWithBell(head);
printList(head);
|
Time Complexity: O(n^2)
Auxiliary Space: O(n)
Share your thoughts in the comments
Please Login to comment...