Skip to content
geeksforgeeks
  • Tutorials
    • Python
    • Java
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
    • Practice Coding Problems
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • DSA
  • Interview Problems on Linked List
  • Practice Linked List
  • MCQs on Linked List
  • Linked List Tutorial
  • Types of Linked List
  • Singly Linked List
  • Doubly Linked List
  • Circular Linked List
  • Circular Doubly Linked List
  • Linked List vs Array
  • Time & Space Complexity
  • Advantages & Disadvantages
Open In App
Next Article:
Construct a linked list from 2D matrix
Next article icon

Construct a linked list from 2D matrix

Last Updated : 26 Sep, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report
Try it on GfG Practice
redirect icon

Given a Matrix mat of n*n size, the task is to construct a 2D linked list representation of the given matrix.

Example:

Input : mat = [[1 2 3]
[4 5 6]
[7 8 9]]
Output :

Construct-a-linked-list-from-2D-matrix-1

Input : mat = [[23 28]
[23 28]]
Output :

Construct-a-linked-list-from-2D-matrix-2

Table of Content

  • [Expected Approach - 1] Recursive Approach - O(n^2) Time and O(n^2) Space
  • [Expected Approach - 2] Iterative Approach - O(n^2) Time and O(n^2) Space

[Expected Approach - 1] Recursive Approach - O(n^2) Time and O(n^2) Space

To recursively construct a linked matrix from a 2D matrix, start at the (0, 0) position of the given matrix and create a node for each matrix element. Each node’s right pointer links to the next element in the same row, while its down pointer connects to the element directly below in the column. If the current position is out of bounds, return NULL to end recursive call. This process continues recursively, creating and linking nodes until the entire matrix is transformed into a linked matrix with appropriate horizontal and vertical connections.

Follow the steps below to solve the problem:

  • First, create a variable of Node type, which will store the value and the addresses of its right and bottom nodes corresponding to a cell in the matrix.
  • Recursively do the following steps for any cell in the matrix:
    • If the cell is out of bounds, return null.
    • Create a new Node with the value from the matrix for the current cell.
    • Recursively construct the right node for the next cell in the row.
    • Recursively construct the down node for the next cell in the column.
  • Finally return the root Node.

Below is the implementation of the above approach:

C++
// C++ to implement linked matrix  // from a 2D matrix recursively  #include <bits/stdc++.h> using namespace std;  class Node { public:     int data;     Node *right, *down;      Node(int x) {         data = x;         right = down = nullptr;     } };  // Function to recursively construct the linked matrix  // from a given 2D vector Node* constructUtil(vector<vector<int>>& mat,                                        int i, int j) {        // Base case: if we are out of bounds, return NULL     if (i >= mat.size() || j >= mat[0].size()) {         return nullptr;     }      // Create a new Node with the current matrix value     Node* curr = new Node(mat[i][j]);      // Recursively construct the right and down pointers     curr->right = constructUtil(mat, i, j + 1);     curr->down = constructUtil(mat, i + 1, j);      // Return the constructed Node     return curr; }  // Function to construct the linked matrix given a 2D vector Node* constructLinkedMatrix(vector<vector<int>>& mat) {        // Call the utility function starting      // from the top-left corner of the matrix     return constructUtil(mat, 0, 0); }  void printList(Node *head) {     Node *currRow = head;     while (currRow != nullptr) {         Node *currCol = currRow;         while (currCol != nullptr) {             cout << currCol->data << " ";             currCol = currCol->right;         }         cout << endl;         currRow = currRow->down;     } }  int main() {         vector<vector<int>> mat = { { 1, 2, 3 },                                 { 4, 5, 6 },                                 { 7, 8, 9 } };      Node* head = constructLinkedMatrix(mat);     printList(head);      return 0; } 
Java
// Java to implement linked matrix  // from a 2D matrix recursively  import java.util.ArrayList;  class Node {     int data;     Node right, down;      Node(int data) {         this.data = data;         this.right = null;         this.down = null;     } }  class GfG {      // Function to recursively construct the linked     // matrix from a given 2D array     static Node constructUtil(int[][] arr, int i, int j) {                // Base case: if we are out of bounds, return null         if (i >= arr.length || j >= arr[0].length) {             return null;         }          // Create a new Node with the current         // matrix value         Node curr = new Node(arr[i][j]);          // Recursively construct the right         // and down pointers         curr.right = constructUtil(arr, i, j + 1);         curr.down = constructUtil(arr, i + 1, j);          // Return the constructed Node         return curr;     }      // Function to construct the linked      // matrix given a 2D array     static Node construct(int arr[][]) {                // Call the utility function starting from the          // top-left corner of the matrix         return constructUtil(arr, 0, 0);     }      static void printList(Node head) {         Node currRow = head;         while (currRow != null) {             Node currCol = currRow;             while (currCol != null) {                 System.out.print(currCol.data + " ");                 currCol = currCol.right;             }             System.out.println();             currRow = currRow.down;         }     }      public static void main(String[] args) {                int arr[][] = {             {1, 2, 3},             {4, 5, 6},             {7, 8, 9}         };          Node head = construct(arr);         printList(head);     } } 
Python
# Python to implement linked matrix  # from a 2D matrix recursively  class Node:     def __init__(self, data):         self.data = data         self.right = None         self.down = None  def constructUtil(mat, i, j):        # Base case: if we are out of bounds, return None     if i >= len(mat) or j >= len(mat[0]):         return None      # Create a new Node with the current matrix value     curr = Node(mat[i][j])      # Recursively construct the right and down pointers     curr.right = constructUtil(mat, i, j + 1)     curr.down = constructUtil(mat, i + 1, j)      # Return the constructed Node     return curr  def constructLinkedMatrix(mat):        # Call the utility function starting      # from the top-left corner of the matrix     return constructUtil(mat, 0, 0)  def printList(head):     currRow = head     while currRow:         currCol = currRow         while currCol:             print(currCol.data, end=" ")             currCol = currCol.right         print()         currRow = currRow.down  if __name__ == "__main__":        mat = [         [1, 2, 3],         [4, 5, 6],         [7, 8, 9]     ]      head = constructLinkedMatrix(mat)     printList(head) 
C#
// C# to implement linked matrix  // from a 2D matrix recursively  using System; using System.Collections.Generic;  class Node {     public int data;     public Node right, down;      public Node(int x) {         data = x;         right = down = null;     } }  class GfG {          // Recursive utility function to construct      // the linked matrix from a 2D List     static Node ConstructUtil(List<List<int>> arr,                                          int i, int j) {                // Base case: if we are out of bounds, return null         if (i >= arr.Count || j >= arr[0].Count)             return null;          // Create a new Node with the current list value         Node curr = new Node(arr[i][j]);          // Recursively construct the right and          // down pointers         curr.right = ConstructUtil(arr, i, j + 1);         curr.down = ConstructUtil(arr, i + 1, j);          // Return the constructed Node         return curr;     }      // Function to construct the linked matrix      // from a List of Lists     static Node Construct(List<List<int>> arr) {                // Call the utility function starting          // from the top-left corner         return ConstructUtil(arr, 0, 0);     }      static void PrintList(Node head) {         Node currRow = head;         while (currRow != null) {             Node currCol = currRow;             while (currCol != null) {                 Console.Write(currCol.data + " ");                 currCol = currCol.right;             }             Console.WriteLine();             currRow = currRow.down;         }     }      static void Main(string[] args) {                List<List<int>> arr = new List<List<int>> {             new List<int> { 1, 2, 3 },             new List<int> { 4, 5, 6 },             new List<int> { 7, 8, 9 }         };          Node head = Construct(arr);         PrintList(head);     } } 
JavaScript
// Javascript to implement linked matrix  // from a 2D matrix recursively  class Node {     constructor(data) {         this.data = data;         this.right = null;         this.down = null;     } }  // Recursive utility function to construct  // the linked matrix function constructUtil(arr, i, j) {      // Base case: if out of bounds, return null     if (i >= arr.length || j >= arr[0].length) {         return null;     }      // Create a new Node with the current array value     const curr = new Node(arr[i][j]);      // Recursively construct the right and down pointers     curr.right = constructUtil(arr, i, j + 1);     curr.down = constructUtil(arr, i + 1, j);      // Return the constructed Node     return curr; }  // Function to construct the linked matrix from a 2D array function constructLinkedMatrix(arr) {      // Start from the top-left corner     return constructUtil(arr, 0, 0); }  function printList(head) {     let currRow = head;     while (currRow !== null) {         let currCol = currRow;         while (currCol !== null) {             console.log(currCol.data + " ");             currCol = currCol.right;         }         console.log();         currRow = currRow.down;     } }  const arr = [     [1, 2, 3],     [4, 5, 6],     [7, 8, 9] ];  const head = constructLinkedMatrix(arr); printList(head); 

Output
1 2 3  4 5 6  7 8 9  

Time complexity: O(n^2), since each element in the 2D matrix is visited once to create the corresponding node in the linked structure.
Auxiliary space: O(n^2), due to the storage needed for each node in the linked matrix.

[Expected Approach - 2] Iterative Approach - O(n^2) Time and O(n^2) Space

The approach involves creating m linked lists, where m represents the number of rows in a given 2D matrix. Each node in these linked lists stores a reference to its right neighbor. The head pointers of each linked list are maintained in an array. After constructing the linked lists, we traverse through them and for each i-th and (i+1)-th list, we establish the down pointers of each node in i-th list to point to the corresponding node in (i+1)-th list. Please refer to Construct a linked list from 2D matrix (Iterative Approach) for implementation.


Next Article
Construct a linked list from 2D matrix

M

msdeep14
Improve
Article Tags :
  • Linked List
  • Matrix
  • DSA
  • FactSet
Practice Tags :
  • FactSet
  • Linked List
  • Matrix

Similar Reads

    Construct a Doubly linked linked list from 2D Matrix
    Given a 2D matrix, the task is to convert it into a doubly-linked list with four pointers that are next, previous, up, and down, each node of this list should be connected to its next, previous, up, and down nodes.Examples: Input: 2D matrix 1 2 3 4 5 6 7 8 9 Output: Approach: The main idea is to con
    15+ min read
    Construct a linked list from 2D matrix (Iterative Approach)
    Given a Matrix mat of n*n size, the task is to construct a 2D linked list representation of the given matrix. Example: Input : mat = [[1 2 3] [4 5 6] [7 8 9]]Output : Input : mat = [[23 28] [23 28]]Output : Approach:To Construct a linked list from 2D matrix iteratively follow the steps below:The ide
    9 min read
    Introduction to Multi Linked List
    A multi-linked list is a special type of list that contains two or more logical key sequences. Before checking details about multi-linked list, see what is a linked list. A linked list is a data structure that is free from any size restriction until the heap memory is not full. We have seen differen
    6 min read
    Construct tree from ancestor matrix
    Given an ancestor matrix mat[n][n] where the Ancestor matrix is defined as below. mat[i][j] = 1 if i is ancestor of jmat[i][j] = 0, otherwiseConstruct a Binary Tree from a given ancestor matrix where all its values of nodes are from 0 to n-1.It may be assumed that the input provided in the program i
    11 min read
    Linked List meaning in DSA
    A linked list is a linear data structure used for storing a sequence of elements, where each element is stored in a node that contains both the element and a pointer to the next node in the sequence. Linked ListTypes of linked lists: Linked lists can be classified in the following categories Singly
    4 min read
geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences