📜  从二维矩阵构造一个链表

📅  最后修改于: 2022-05-13 01:57:24.285000             🧑  作者: Mango

从二维矩阵构造一个链表

给定一个矩阵。将其转换为链表矩阵,使得每个节点都连接到其下一个右下节点。
例子:

Input : 2D matrix 
1 2 3
4 5 6
7 8 9

Output :
1 -> 2 -> 3 -> NULL
|    |    |
v    v    v
4 -> 5 -> 6 -> NULL
|    |    |
v    v    v
7 -> 8 -> 9 -> NULL
|    |    |
v    v    v
NULL NULL NULL

问题来源: Factset 面试经历 |设置 9

这个想法是为矩阵的每个元素构造一个新节点,并递归地创建它的下节点和右节点。

C++
// CPP program to construct a linked list
// from given 2D matrix
#include 
using namespace std;
 
// struct node of linked list
struct Node {
    int data;
    Node* right, *down;
};
 
// returns head pointer of linked list
// constructed from 2D matrix
Node* construct(int arr[][3], int i, int j,
                              int m, int n)
{
    // return if i or j is out of bounds
    if (i > n - 1 || j > m - 1)
        return NULL;
 
    // create a new node for current i and j
    // and recursively allocate its down and
    // right pointers
    Node* temp = new Node();
    temp->data = arr[i][j];
    temp->right = construct(arr, i, j + 1, m, n);
    temp->down  = construct(arr, i + 1, j, m, n);
    return temp;
}
 
// utility function for displaying
// linked list data
void display(Node* head)
{
    // pointer to move right
    Node* Rp;
 
    // pointer to move down
    Node* Dp = head;
 
    // loop till node->down is not NULL
    while (Dp) {
        Rp = Dp;
 
        // loop till node->right is not NULL
        while (Rp) {
            cout << Rp->data << " ";
            Rp = Rp->right;
        }
        cout << "\n";
        Dp = Dp->down;
    }
}
 
// driver program
int main()
{
    // 2D matrix
    int arr[][3] = {
        { 1, 2, 3 },
        { 4, 5, 6 },
        { 7, 8, 9 }
    };
 
    int m = 3, n = 3;
    Node* head = construct(arr, 0, 0, m, n);
    display(head);
    return 0;
}


Java
// Java program to construct a linked list
// from given 2D matrix
public class Linked_list_2D_Matrix {
 
    // node of linked list
    static class Node {
        int data;
        Node right;
        Node down;
    };
 
    // returns head pointer of linked list
    // constructed from 2D matrix
    static Node construct(int arr[][], int i, int j,
                                     int m, int n) {
         
        // return if i or j is out of bounds
        if (i > n - 1 || j > m - 1)
            return null;
 
        // create a new node for current i and j
        // and recursively allocate its down and
        // right pointers
        Node temp = new Node();
        temp.data = arr[i][j];
        temp.right = construct(arr, i, j + 1, m, n);
        temp.down = construct(arr, i + 1, j, m, n);
        return temp;
    }
 
    // utility function for displaying
    // linked list data
    static void display(Node head) {
         
        // pointer to move right
        Node Rp;
 
        // pointer to move down
        Node Dp = head;
 
        // loop till node->down is not NULL
        while (Dp != null) {
            Rp = Dp;
 
            // loop till node->right is not NULL
            while (Rp != null) {
                System.out.print(Rp.data + " ");
                Rp = Rp.right;
            }
            System.out.println();
            Dp = Dp.down;
        }
    }
 
    // driver program
    public static void main(String args[]) {
        // 2D matrix
        int arr[][] = { { 1, 2, 3 },
                        { 4, 5, 6 },
                       { 7, 8, 9 } };
 
        int m = 3, n = 3;
        Node head = construct(arr, 0, 0, m, n);
        display(head);
    }
 
}
// This code is contributed by Sumit Ghosh


Python3
# Python3 program to construct a linked list
# from given 2D matrix
import math
 
# struct node of linked list
class Node:
    def __init__(self, data):
        self.data = data
        self.right = None
        self.down = None
 
# returns head pointer of linked list
# constructed from 2D matrix
def construct(arr, i, j, m, n):
     
    # return if i or j is out of bounds
    if (i > n - 1 or j > m - 1):
        return None
 
    # create a new node for current i and j
    # and recursively allocate its down and
    # right pointers
    temp = Node(arr[i][j])
    temp.data = arr[i][j]
    temp.right = construct(arr, i, j + 1, m, n)
    temp.down = construct(arr, i + 1, j, m, n)
    return temp
 
# utility function for displaying
# linked list data
def display(head):
     
    # pointer to move right
    # Rp
 
    # pointer to move down
    Dp = head
 
    # loop till node.down is not None
    while (Dp):
        Rp = Dp
 
        # loop till node.right is not None
        while (Rp):
            print(Rp.data, end = " ")
            Rp = Rp.right
         
        print()
        Dp = Dp.down
     
# Driver Code
if __name__=='__main__':
    # 2D matrix
    arr = [[ 1, 2, 3 ],
           [ 4, 5, 6 ],
           [ 7, 8, 9 ]]
 
    m, n = 3, 3
    head = construct(arr, 0, 0, m, n)
    display(head)
     
# This code is contributed by AbhiThakur


C#
// C# program to construct a linked list
// from given 2D matrix
using System;
     
public class Linked_list_2D_Matrix
{
 
    // node of linked list
    public class Node
    {
        public int data;
        public Node right;
        public Node down;
    };
 
    // returns head pointer of linked list
    // constructed from 2D matrix
    static Node construct(int [,]arr, int i, int j,
                                    int m, int n)
    {
         
        // return if i or j is out of bounds
        if (i > n - 1 || j > m - 1)
            return null;
 
        // create a new node for current i and j
        // and recursively allocate its down and
        // right pointers
        Node temp = new Node();
        temp.data = arr[i, j];
        temp.right = construct(arr, i, j + 1, m, n);
        temp.down = construct(arr, i + 1, j, m, n);
        return temp;
    }
 
    // utility function for displaying
    // linked list data
    static void display(Node head)
    {
         
        // pointer to move right
        Node Rp;
 
        // pointer to move down
        Node Dp = head;
 
        // loop till node->down is not NULL
        while (Dp != null)
        {
            Rp = Dp;
 
            // loop till node->right is not NULL
            while (Rp != null)
            {
                Console.Write(Rp.data + " ");
                Rp = Rp.right;
            }
            Console.WriteLine();
            Dp = Dp.down;
        }
    }
 
    // Driver program
    public static void Main()
    {
        // 2D matrix
        int [,]arr = { { 1, 2, 3 },
                        { 4, 5, 6 },
                    { 7, 8, 9 } };
 
        int m = 3, n = 3;
        Node head = construct(arr, 0, 0, m, n);
        display(head);
    }
}
 
/* This code contributed by PrinciRaj1992 */


Javascript


输出:

1 2 3 
4 5 6 
7 8 9