C ++の2Dマトリックス(反復アプローチ)からリンクリストを作成します
行列が1つあるとすると、反復アプローチを使用して2Dリンクリストに変換する必要があります。リストには右ポインタと下ポインタがあります。
したがって、入力が次のような場合
| 10 | 20 | 30 |
| 40 | 50 | 60 |
| 70 | 80 | 90 |
これを解決するには、次の手順に従います-
-
real_head:=NULL
-
サイズがmの配列head_arrを定義します。
-
初期化i:=0の場合、i
-
head_arr [i]:=NULL
-
初期化j:=0の場合、j
-
p:=値mat [i、j]
の新しいツリーノード -
real_headがnullの場合、-
-
real_head:=p
-
-
head_arr [i]がnullの場合、-
-
head_arr [i]:=p
-
-
それ以外の場合
-
right_ptrの右:=p
-
-
right_ptr:=p
-
-
-
初期化i:=0の場合、i
-
p:=head_arr [i]、q =head_arr [i + 1]
-
(pとqは両方ともnullではありません)、実行-
-
pのダウン:=q
-
p:=pの権利
-
q:=qの権利
-
-
-
real_headを返す
例
理解を深めるために、次の実装を見てみましょう-
#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
-
C++でマルチレベルリンクリストをフラット化する
この問題では、マルチレベルのリンクリストが提供されます。私たちの仕事は、マルチレベルのリンクリストをフラット化するプログラムを作成することです。 平坦化操作は、リンクリストで最初に第1レベルのノードが発生し、次に第2レベルのノードが発生するように実行されます。 マルチレベルリンクリスト は多次元データ構造であり、リンクリストのすべてのノードに2つのリンクポインタがあります。1つは次のノードへのリンクで、もう1つは1つ以上のノードを持つ子リストへのリンクです。この子ポインタは、他のリストノードを指している場合とそうでない場合があります。 例 問題を理解するために例を見てみましょう
-
C++の2Dマトリックスからリンクリストを作成します
行列が1つあるとすると、再帰的アプローチを使用して2Dリンクリストに変換する必要があります。 リストには右ポインタと下ポインタがあります。 したがって、入力が次のような場合 10 20 30 40 50 60 70 80 90 出力はになります これを解決するには、次の手順に従います- 関数make_2d_list()を定義します。これは、行列mat、i、j、m、n、を取ります。 iとjが行列の境界にない場合、- nullを返す temp:=値mat [i、j]で新しいノードを作成します 温度