HackerRank Inserting a Node Into a Sorted Doubly Linked List solution YASH PAL, 31 July 2024 In this HackerRank Inserting a Node into a sorted doubly linked list Interview preparation kit problem You have Given a reference to the head of a doubly-linked list and an integer, data, create a new DoublyLinkedListNode object having data value data and insert it at the proper location to maintain the sort. Problem solution in Python programming. #!/bin/python3 import math import os import random import re import sys class DoublyLinkedListNode: def __init__(self, node_data): self.data = node_data self.next = None self.prev = None class DoublyLinkedList: def __init__(self): self.head = None self.tail = None def insert_node(self, node_data): node = DoublyLinkedListNode(node_data) if not self.head: self.head = node else: self.tail.next = node node.prev = self.tail self.tail = node def print_doubly_linked_list(node, sep, fptr): while node: fptr.write(str(node.data)) node = node.next if node: fptr.write(sep) # Complete the sortedInsert function below. # # For your reference: # # DoublyLinkedListNode: # int data # DoublyLinkedListNode next # DoublyLinkedListNode prev # # def sortedInsert(head, data): cur=head node=DoublyLinkedListNode(data) if cur.data>data or cur.data==data: node.next=cur cur.prev=node head=node return head while cur.next: if (cur.data<data and cur.next.data>data) or cur.data==data: node.next=cur.next cur.next.prev=node node.prev=cur cur.next=node return head cur=cur.next if cur.data<data or cur.data==data: node.prev=cur cur.next=node return head if __name__ == '__main__': fptr = open(os.environ['OUTPUT_PATH'], 'w') t = int(input()) for t_itr in range(t): llist_count = int(input()) llist = DoublyLinkedList() for _ in range(llist_count): llist_item = int(input()) llist.insert_node(llist_item) data = int(input()) llist1 = sortedInsert(llist.head, data) print_doubly_linked_list(llist1, ' ', fptr) fptr.write('n') fptr.close() Problem solution in Java Programming. import java.io.*; import java.math.*; import java.security.*; import java.text.*; import java.util.*; import java.util.concurrent.*; import java.util.regex.*; public class Solution { static class DoublyLinkedListNode { public int data; public DoublyLinkedListNode next; public DoublyLinkedListNode prev; public DoublyLinkedListNode(int nodeData) { this.data = nodeData; this.next = null; this.prev = null; } } static class DoublyLinkedList { public DoublyLinkedListNode head; public DoublyLinkedListNode tail; public DoublyLinkedList() { this.head = null; this.tail = null; } public void insertNode(int nodeData) { DoublyLinkedListNode node = new DoublyLinkedListNode(nodeData); if (this.head == null) { this.head = node; } else { this.tail.next = node; node.prev = this.tail; } this.tail = node; } } public static void printDoublyLinkedList(DoublyLinkedListNode node, String sep, BufferedWriter bufferedWriter) throws IOException { while (node != null) { bufferedWriter.write(String.valueOf(node.data)); node = node.next; if (node != null) { bufferedWriter.write(sep); } } } // Complete the sortedInsert function below. /* * For your reference: * * DoublyLinkedListNode { * int data; * DoublyLinkedListNode next; * DoublyLinkedListNode prev; * } * */ static DoublyLinkedListNode sortedInsert(DoublyLinkedListNode head, int data) { DoublyLinkedListNode node = new DoublyLinkedListNode(data); if (head == null) { return node; } else if (data <= head.data) { node.next = head; head.prev = node; return node; } else { DoublyLinkedListNode ptr = sortedInsert(head.next, data); head.next = ptr; ptr.prev = head; return head; } } private static final Scanner scanner = new Scanner(System.in); public static void main(String[] args) throws IOException { BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH"))); int t = scanner.nextInt(); scanner.skip("(rn|[nru2028u2029u0085])?"); for (int tItr = 0; tItr < t; tItr++) { DoublyLinkedList llist = new DoublyLinkedList(); int llistCount = scanner.nextInt(); scanner.skip("(rn|[nru2028u2029u0085])?"); for (int i = 0; i < llistCount; i++) { int llistItem = scanner.nextInt(); scanner.skip("(rn|[nru2028u2029u0085])?"); llist.insertNode(llistItem); } int data = scanner.nextInt(); scanner.skip("(rn|[nru2028u2029u0085])?"); DoublyLinkedListNode llist1 = sortedInsert(llist.head, data); printDoublyLinkedList(llist1, " ", bufferedWriter); bufferedWriter.newLine(); } bufferedWriter.close(); scanner.close(); } } Problem solution in C++ programming. #include <bits/stdc++.h> using namespace std; class DoublyLinkedListNode { public: int data; DoublyLinkedListNode *next; DoublyLinkedListNode *prev; DoublyLinkedListNode(int node_data) { this->data = node_data; this->next = nullptr; this->prev = nullptr; } }; class DoublyLinkedList { public: DoublyLinkedListNode *head; DoublyLinkedListNode *tail; DoublyLinkedList() { this->head = nullptr; this->tail = nullptr; } void insert_node(int node_data) { DoublyLinkedListNode* node = new DoublyLinkedListNode(node_data); if (!this->head) { this->head = node; } else { this->tail->next = node; node->prev = this->tail; } this->tail = node; } }; void print_doubly_linked_list(DoublyLinkedListNode* node, string sep, ofstream& fout) { while (node) { fout << node->data; node = node->next; if (node) { fout << sep; } } } void free_doubly_linked_list(DoublyLinkedListNode* node) { while (node) { DoublyLinkedListNode* temp = node; node = node->next; free(temp); } } // Complete the sortedInsert function below. /* * For your reference: * * DoublyLinkedListNode { * int data; * DoublyLinkedListNode* next; * DoublyLinkedListNode* prev; * }; * */ DoublyLinkedListNode* sortedInsert(DoublyLinkedListNode* head, int data) { DoublyLinkedListNode* node = new DoublyLinkedListNode(data); node->data = data; node->next = node->prev = NULL; if(head==NULL) return node; if(head->data > data){ head->prev = node; node->next = head; return node; } DoublyLinkedListNode* next = sortedInsert(head->next, data); head->next = next; next->prev = head; return head; } int main() { ofstream fout(getenv("OUTPUT_PATH")); int t; cin >> t; cin.ignore(numeric_limits<streamsize>::max(), 'n'); for (int t_itr = 0; t_itr < t; t_itr++) { DoublyLinkedList* llist = new DoublyLinkedList(); int llist_count; cin >> llist_count; cin.ignore(numeric_limits<streamsize>::max(), 'n'); for (int i = 0; i < llist_count; i++) { int llist_item; cin >> llist_item; cin.ignore(numeric_limits<streamsize>::max(), 'n'); llist->insert_node(llist_item); } int data; cin >> data; cin.ignore(numeric_limits<streamsize>::max(), 'n'); DoublyLinkedListNode* llist1 = sortedInsert(llist->head, data); print_doubly_linked_list(llist1, " ", fout); fout << "n"; free_doubly_linked_list(llist1); } fout.close(); return 0; } Problem solution in C programming. #include <assert.h> #include <limits.h> #include <math.h> #include <stdbool.h> #include <stddef.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> char* readline(); typedef struct DoublyLinkedListNode DoublyLinkedListNode; typedef struct DoublyLinkedList DoublyLinkedList; struct DoublyLinkedListNode { int data; DoublyLinkedListNode* next; DoublyLinkedListNode* prev; }; struct DoublyLinkedList { DoublyLinkedListNode* head; DoublyLinkedListNode* tail; }; DoublyLinkedListNode* create_doubly_linked_list_node(int node_data) { DoublyLinkedListNode* node = malloc(sizeof(DoublyLinkedListNode)); node->data = node_data; node->next = NULL; node->prev = NULL; return node; } void insert_node_into_doubly_linked_list(DoublyLinkedList** doubly_linked_list, int node_data) { DoublyLinkedListNode* node = create_doubly_linked_list_node(node_data); if (!(*doubly_linked_list)->head) { (*doubly_linked_list)->head = node; } else { (*doubly_linked_list)->tail->next = node; node->prev = (*doubly_linked_list)->tail; } (*doubly_linked_list)->tail = node; } void print_doubly_linked_list(DoublyLinkedListNode* node, char* sep, FILE* fptr) { while (node) { fprintf(fptr, "%d", node->data); node = node->next; if (node) { fprintf(fptr, "%s", sep); } } } void free_doubly_linked_list(DoublyLinkedListNode* node) { while (node) { DoublyLinkedListNode* temp = node; node = node->next; free(temp); } } // Complete the sortedInsert function below. /* * For your reference: * * DoublyLinkedListNode { * int data; * DoublyLinkedListNode* next; * DoublyLinkedListNode* prev; * }; * */ DoublyLinkedListNode* sortedInsert(DoublyLinkedListNode* head, int data) { DoublyLinkedListNode *new = create_doubly_linked_list_node(data); if (head == NULL) return new; if (new->data <= head->data) { // Insert at head of list new->next = head; head->prev = new; return new; } DoublyLinkedListNode *curr = head; while (curr->next != NULL && curr->next->data < new->data) { curr = curr->next; } if (curr->next == NULL) { // Insert at end of list curr->next = new; new->prev = curr; } else { // Insert somewhere in the middle new->next = curr->next; curr->next->prev = curr; curr->next = new; } return head; } int main() { FILE* fptr = fopen(getenv("OUTPUT_PATH"), "w"); char* t_endptr; char* t_str = readline(); int t = strtol(t_str, &t_endptr, 10); if (t_endptr == t_str || *t_endptr != ' ') { exit(EXIT_FAILURE); } for (int t_itr = 0; t_itr < t; t_itr++) { DoublyLinkedList* llist = malloc(sizeof(DoublyLinkedList)); llist->head = NULL; llist->tail = NULL; char* llist_count_endptr; char* llist_count_str = readline(); int llist_count = strtol(llist_count_str, &llist_count_endptr, 10); if (llist_count_endptr == llist_count_str || *llist_count_endptr != ' ') { exit(EXIT_FAILURE); } for (int i = 0; i < llist_count; i++) { char* llist_item_endptr; char* llist_item_str = readline(); int llist_item = strtol(llist_item_str, &llist_item_endptr, 10); if (llist_item_endptr == llist_item_str || *llist_item_endptr != ' ') { exit(EXIT_FAILURE); } insert_node_into_doubly_linked_list(&llist, llist_item); } char* data_endptr; char* data_str = readline(); int data = strtol(data_str, &data_endptr, 10); if (data_endptr == data_str || *data_endptr != ' ') { exit(EXIT_FAILURE); } DoublyLinkedListNode* llist1 = sortedInsert(llist->head, data); char *sep = " "; print_doubly_linked_list(llist1, sep, fptr); fprintf(fptr, "n"); free_doubly_linked_list(llist1); } fclose(fptr); return 0; } char* readline() { size_t alloc_length = 1024; size_t data_length = 0; char* data = malloc(alloc_length); while (true) { char* cursor = data + data_length; char* line = fgets(cursor, alloc_length - data_length, stdin); if (!line) { break; } data_length += strlen(cursor); if (data_length < alloc_length - 1 || data[data_length - 1] == 'n') { break; } size_t new_length = alloc_length << 1; data = realloc(data, new_length); if (!data) { break; } alloc_length = new_length; } if (data[data_length - 1] == 'n') { data[data_length - 1] = ' '; } data = realloc(data, data_length); return data; } Problem solution in JavaScript programming. 'use strict'; const fs = require('fs'); process.stdin.resume(); process.stdin.setEncoding('utf-8'); let inputString = ''; let currentLine = 0; process.stdin.on('data', inputStdin => { inputString += inputStdin; }); process.stdin.on('end', _ => { inputString = inputString.replace(/s*$/, '') .split('n') .map(str => str.replace(/s*$/, '')); main(); }); function readLine() { return inputString[currentLine++]; } const DoublyLinkedListNode = class { constructor(nodeData) { this.data = nodeData; this.next = null; this.prev = null; } }; const DoublyLinkedList = class { constructor() { this.head = null; this.tail = null; } insertNode(nodeData) { let node = new DoublyLinkedListNode(nodeData); if (this.head == null) { this.head = node; } else { this.tail.next = node; node.prev = this.tail; } this.tail = node; } }; function printDoublyLinkedList(node, sep, ws) { while (node != null) { ws.write(String(node.data)); node = node.next; if (node != null) { ws.write(sep); } } } // Complete the sortedInsert function below. /* * For your reference: * * DoublyLinkedListNode { * int data; * DoublyLinkedListNode next; * DoublyLinkedListNode prev; * } * */ function sortedInsert(head, data) { if(head == null) { return new DoublyLinkedListNode(data); } var current = head; if(data < current.data) { var newNode = new DoublyLinkedListNode(data); newNode.next = current; current.prev = newNode; return newNode; } while(current != null) { if(data >= current.data) { if(current.next == null) { var newNode = new DoublyLinkedListNode(data); current.next = newNode; newNode.prev = current; return head; } if(current.next.data >= data) { var newNode = new DoublyLinkedListNode(data); newNode.next = current.next; newNode.prev = current; current.next = newNode; newNode.next.prev = newNode; return head; } } current = current.next; } return head; } function main() { const ws = fs.createWriteStream(process.env.OUTPUT_PATH); const t = parseInt(readLine(), 10); for (let tItr = 0; tItr < t; tItr++) { const llistCount = parseInt(readLine(), 10); let llist = new DoublyLinkedList(); for (let i = 0; i < llistCount; i++) { const llistItem = parseInt(readLine(), 10); llist.insertNode(llistItem); } const data = parseInt(readLine(), 10); let llist1 = sortedInsert(llist.head, data); printDoublyLinkedList(llist1, " ", ws) ws.write("n"); } ws.end(); } coding problems data structure interview prepration kit