HackerRank Reverse a doubly linked list problem solution YASH PAL, 31 July 2024 In this HackerRank Reverse a doubly linked list Interview preparation kit problem You have Given the pointer to the head node of a doubly-linked list, reverse the order of the nodes in place. That is, change the next and prev pointers of the nodes so that the direction of the list is reversed. Return a reference to the head node of the reversed list. 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 reverse function below. # # For your reference: # # DoublyLinkedListNode: # int data # DoublyLinkedListNode next # DoublyLinkedListNode prev # # def reverse(head): if head == None or head.next == None: return head while True: temp = head.next head.next = head.prev head.prev = temp head = head.prev if head.next == None: break temp = head.next head.next = head.prev head.prev = temp 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) llist1 = reverse(llist.head) 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 reverse function below. /* * For your reference: * * DoublyLinkedListNode { * int data; * DoublyLinkedListNode next; * DoublyLinkedListNode prev; * } * */ static DoublyLinkedListNode reverse(DoublyLinkedListNode curr) { DoublyLinkedListNode temp = curr.next; curr.next = curr.prev; curr.prev = temp; return temp == null ? curr : reverse(temp); } 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); } DoublyLinkedListNode llist1 = reverse(llist.head); 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 reverse function below. /* * For your reference: * * DoublyLinkedListNode { * int data; * DoublyLinkedListNode* next; * DoublyLinkedListNode* prev; * }; * */ DoublyLinkedListNode* reverse(DoublyLinkedListNode* head) { // Complete this function // Do not write the main method. DoublyLinkedListNode *current = head; DoublyLinkedListNode *temp = NULL; while ( current != NULL) { temp = current -> prev; current -> prev = current -> next; current -> next = temp; current = current -> prev; } if (temp != NULL) head = temp -> prev; 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); } DoublyLinkedListNode* llist1 = reverse(llist->head); 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 reverse function below. /* * For your reference: * * DoublyLinkedListNode { * int data; * DoublyLinkedListNode* next; * DoublyLinkedListNode* prev; * }; * */ DoublyLinkedListNode* reverse(DoublyLinkedListNode* head) { DoublyLinkedListNode *curr = head, *next = NULL, *prev = NULL; while (curr != NULL) { next = curr->next; curr->next = prev; curr->prev = next; prev = curr; curr = next; } return prev; } 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); } DoublyLinkedListNode* llist1 = reverse(llist->head); 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 reverse function below. /* * For your reference: * * DoublyLinkedListNode { * int data; * DoublyLinkedListNode next; * DoublyLinkedListNode prev; * } * */ function reverse(head) { var current = head; while(current) { var curNext = current.next; current.next = current.prev; current.prev = curNext; if (curNext) { current = curNext; } else { return current; } } } 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); } let llist1 = reverse(llist.head); printDoublyLinkedList(llist1, " ", ws) ws.write("n"); } ws.end(); } coding problems data structure interview prepration kit