Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

สร้าง Linked List แบบ 2 มิติจาก Matrix ด้วย Iterative Approach ใน C++


สมมติว่าเรามีเมทริกซ์ ต้องการแปลงเป็น linked list แบบ 2 มิติโดยใช้วิธี iterative (วนลูป) โหนดมี pointer right และ down เช่นเดียวกับวิธี recursive

ตัวอย่างอินพุตและเอาต์พุตเหมือนวิธี recursive

ขั้นตอนการแก้ปัญหา (Iterative)

  1. สร้างตัวแปร real_head เก็บหัวของลิสต์จริง
  2. สร้างอาเรย์ head_arr ขนาด m เก็บหัวของแต่ละแถว
  3. วนลูปสร้างโหนดแถวละแถว เชื่อม right ภายในแถวเดียวกัน
  4. หลังสร้างทุกแถวแล้ว วนลูปเชื่อม down ระหว่างแถวที่ติดกัน
  5. คืนค่า real_head

ตัวอย่างโค้ด C++

#include <bits/stdc++.h>
using namespace std;

class TreeNode {
public:
    int data;
    TreeNode *right, *down;
    TreeNode(int d) {
        data = d;
        right = down = NULL;
    }
};

void show_2d_list(TreeNode* head) {
    TreeNode *right_ptr, *down_ptr = head;
    while (down_ptr) {
        right_ptr = down_ptr;
        while (right_ptr) {
            cout << right_ptr->data << " ";
            right_ptr = right_ptr->right;
        }
        cout << endl;
        down_ptr = down_ptr->down;
    }
}

TreeNode* make_2d_list(int mat[][3], int m, int n) {
    TreeNode* real_head = NULL;
    TreeNode* head_arr[m];
    TreeNode *right_ptr, *p;

    for (int i = 0; i < m; i++) {
        head_arr[i] = NULL;
        for (int j = 0; j < n; j++) {
            p = new TreeNode(mat[i][j]);
            if (!real_head) real_head = p;
            if (!head_arr[i]) head_arr[i] = p;
            else right_ptr->right = p;
            right_ptr = p;
        }
    }

    for (int i = 0; i < m - 1; i++) {
        TreeNode *p = head_arr[i], *q = head_arr[i + 1];
        while (p && q) {
            p->down = q;
            p = p->right;
            q = q->right;
        }
    }
    return real_head;
}

int main() {
    int m = 3, n = 3;
    int mat[][3] = {
        { 10, 20, 30 },
        { 40, 50, 60 },
        { 70, 80, 90 }
    };
    TreeNode* head = make_2d_list(mat, m, n);
    show_2d_list(head);
}

อินพุต

{ { 10, 20, 30 }, { 40, 50, 60 }, { 70, 80, 90 } }

เอาต์พุท

10 20 30
40 50 60
70 80 90