Given an encoded Linked List which is encoded using the Run Length Encoding algorithm. The task is to decode the given linked list and generate the input string.
Run Length Encoding: In run length encoding, the input string is encoded by replacing a substring of repeated character in the string by the character followed by its count. If the character is single and is non-repeating than it’s count is not added. For Example, if the input string is “wwwwaaadexxxxxx”, then the function should return “w4a3dex6”
Examples:
Input : List = a->5->b->r->3->NULL
Output : string = “aaaaabrrr”
Explanation :
From the linked list, the character is ‘a’ and it’s count is 5 so the character is repeated 5 times.
The next character is ‘b’ and the next character to it is not a number hence the character ‘b’ is repeated only once.
The next character is ‘r’ and the count is 3 hence the character is repeated 3 times.
Input : List = a->b->r->3->a->3->NULL
Output : string = “abrrraaa”
Approach:
- Traverse through the linked list.
- Store the current character in a variable c.
- Check if the next node is a number and store the number in count else count is 1.
- Append the character c to the list count times.
Below is the implementation of the above approach:
C++
// C++ program to decode a linked list #include <bits/stdc++.h> using namespace std; // Linked list node struct Node { char data; struct Node* next; }; // Utility function to create a new Node Node* newNode( char data) { Node* temp = new Node; temp->data = data; temp->next = NULL; return temp; } // Function to append nodes to a list void append( struct Node* head_ref, char new_data) { struct Node* new_node = new Node; struct Node* last = head_ref; new_node->data = new_data; new_node->next = NULL; if (head_ref == NULL) { head_ref = new_node; return ; } while (last->next != NULL) last = last->next; last->next = new_node; return ; } // Function to print list void printList(Node* node) { while (node != NULL) { cout << node->data << " " ; node = node->next; } } // Function to decode the linked list string decodeList(Node* head) { Node* p = head; string res = "" ; int count; // While there are nodes left while (p) { // To store the count by which the current // character needs to be repeated count = 0; // Get the current character char c = p->data; if (p->next) { Node* temp = p->next; // If current node is a digit if (temp && temp->data >= '0' && temp->data <= '9' ) { // Generate the integer from // the consecutive digits while (temp && temp->data >= '0' && temp->data <= '9' ) { count = count * 10 + (temp->data - '0' ); temp = temp->next; } p = temp; } else { count = 1; p = p->next; } } else { count = 1; p = p->next; } // Repeat the character count times for ( int i = 0; i < count; i++) { res += c; } } return res; } // Driver code int main() { // Creating the linked list Node* head = newNode( 'a' ); head->next = newNode( '5' ); head->next->next = newNode( 'b' ); head->next->next->next = newNode( 'r' ); cout << decodeList(head); return 0; } |
Java
// Java program to decode a linked list class GFG { // Linked list node static class Node { char data; Node next; }; // Utility function to create a new Node static Node newNode( char data) { Node temp = new Node(); temp.data = data; temp.next = null ; return temp; } // Function to append nodes to a list static void append(Node head_ref, char new_data) { Node new_node = new Node(); Node last = head_ref; new_node.data = new_data; new_node.next = null ; if (head_ref == null ) { head_ref = new_node; return ; } while (last.next != null ) last = last.next; last.next = new_node; return ; } // Function to print list static void printList(Node node) { while (node != null ) { System.out.print(node.data + " " ); node = node.next; } } // Function to decode the linked list static String decodeList(Node head) { // Pointer used to traverse through all // the nodes in the list Node p = head; // String to store the decoded message String res = "" ; int count; // While there are nodes left while (p != null ) { // To store the count by which the current // character needs to be repeated count = 0 ; // Get the current character char c = p.data; if (p.next != null ) { Node temp = p.next; // If current node is a digit if (temp != null && temp.data >= '0' && temp.data <= '9' ) { // Generate the integer from // the consecutive digits while (temp != null && temp.data >= '0' && temp.data <= '9' ) { count = count * 10 + (temp.data - '0' ); temp = temp.next; } p = temp; } else { count = 1 ; p = p.next; } } else { count = 1 ; p = p.next; } // Repeat the character count times for ( int i = 0 ; i < count; i++) { res += c; } } return res; } // Driver code public static void main(String args[]) { // Creating the linked list Node head = newNode( 'a' ); head.next = newNode( '5' ); head.next.next = newNode( 'b' ); head.next.next.next = newNode( 'r' ); System.out.println(decodeList(head)); } } /* This code contributed by PrinciRaj1992 */ |
Python3
# Python3 program to decode a linked list # Linked list node class Node: def __init__( self , data): self .data = data self . next = None # Utility function to create a Node def newNode(data): temp = Node(data); temp. next = None ; return temp; # Function to append nodes to a list def append(head_ref, new_data): new_node = Node; last = head_ref; new_node.data = new_data; new_node. next = None ; if (head_ref = = None ): head_ref = new_node; return ; while (last. next ! = None ): last = last. next ; last. next = new_node; return ; # Function to print list def printList(node): while (node ! = None ): print (node.data, end = ' ' ) node = node. next ; # Function to decode the linked list def decodeList(head): p = head; res = ""; count = 0 # While there are nodes left while (p ! = None ): # To store the count by which the current # character needs to be repeated count = 0 ; # Get the current character c = p.data; if (p. next ! = None ): temp = p. next ; # If current node is a digit if (temp ! = None and ord (temp.data) > = ord ( '0' ) and ord (temp.data) < = ord ( '9' )): # Generate the integer from # the consecutive digits while (temp ! = None and ord (temp.data) > = ord ( '0' ) and ord (temp.data) < = ord ( '9' )): count = count * 10 + ord (temp.data) - ord ( '0' ) temp = temp. next ; p = temp; else : count = 1 ; p = p. next ; else : count = 1 ; p = p. next ; # Repeat the character count times for i in range ( 0 , count): res + = c; return res; # Driver code if __name__ = = '__main__' : # Creating the linked list head = newNode( 'a' ); head. next = newNode( '5' ); head. next . next = newNode( 'b' ); head. next . next . next = newNode( 'r' ); print (decodeList(head)) # This code is contributed by rutvik_56 |
C#
// C# program to decode a linked list using System; public class GFG { // Linked list node public class Node { public char data; public Node next; }; // Utility function to create a new Node static Node newNode( char data) { Node temp = new Node(); temp.data = data; temp.next = null ; return temp; } // Function to append nodes to a list static void append(Node head_ref, char new_data) { Node new_node = new Node(); Node last = head_ref; new_node.data = new_data; new_node.next = null ; if (head_ref == null ) { head_ref = new_node; return ; } while (last.next != null ) last = last.next; last.next = new_node; return ; } // Function to print list static void printList(Node node) { while (node != null ) { Console.Write(node.data + " " ); node = node.next; } } // Function to decode the linked list static String decodeList(Node head) { // Pointer used to traverse through all // the nodes in the list Node p = head; // String to store the decoded message String res = "" ; int count; // While there are nodes left while (p != null ) { // To store the count by which the current // character needs to be repeated count = 0; // Get the current character char c = p.data; if (p.next != null ) { Node temp = p.next; // If current node is a digit if (temp != null && temp.data >= '0' && temp.data <= '9' ) { // Generate the integer from // the consecutive digits while (temp != null && temp.data >= '0' && temp.data <= '9' ) { count = count * 10 + (temp.data - '0' ); temp = temp.next; } p = temp; } else { count = 1; p = p.next; } } else { count = 1; p = p.next; } // Repeat the character count times for ( int i = 0; i < count; i++) { res += c; } } return res; } // Driver code public static void Main(String[] args) { // Creating the linked list Node head = newNode( 'a' ); head.next = newNode( '5' ); head.next.next = newNode( 'b' ); head.next.next.next = newNode( 'r' ); Console.WriteLine(decodeList(head)); } } // This code is contributed by 29AjayKumar |
Javascript
<script> // JavaScript program to decode a linked list // Linked list node class Node { constructor() { this .data = 0; this .next = null ; } } // Utility function to create a new Node function newNode(data) { var temp = new Node(); temp.data = data; temp.next = null ; return temp; } // Function to append nodes to a list function append(head_ref, new_data) { var new_node = new Node(); var last = head_ref; new_node.data = new_data; new_node.next = null ; if (head_ref == null ) { head_ref = new_node; return ; } while (last.next != null ) last = last.next; last.next = new_node; return ; } // Function to print list function printList(node) { while (node != null ) { document.write(node.data + " " ); node = node.next; } } // Function to decode the linked list function decodeList(head) { // Pointer used to traverse through all // the nodes in the list var p = head; // String to store the decoded message var res = "" ; var count; // While there are nodes left while (p != null ) { // To store the count by which the current // character needs to be repeated count = 0; // Get the current character var c = p.data; if (p.next != null ) { var temp = p.next; // If current node is a digit if (temp != null && temp.data >= "0" && temp.data <= "9" ) { // Generate the integer from // the consecutive digits while (temp != null && temp.data >= "0" && temp.data <= "9" ) { count = count * 10 + (temp.data - "0" ); temp = temp.next; } p = temp; } else { count = 1; p = p.next; } } else { count = 1; p = p.next; } // Repeat the character count times for ( var i = 0; i < count; i++) { res += c; } } return res; } // Driver code // Creating the linked list var head = newNode( "a" ); head.next = newNode( "5" ); head.next.next = newNode( "b" ); head.next.next.next = newNode( "r" ); document.write(decodeList(head)); </script> |
aaaaabr
Time Complexity : O(n)
Space Complexity : O(n)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!