C++のリンクリストの最後からn番目のノードを見つけるための再帰的アプローチ
単一リンクリストと正の整数Nを入力として指定します。目標は、再帰を使用して、指定されたリストの最後からN番目のノードを見つけることです。入力リストにノードa→b→c→d→e→fがあり、Nが4の場合、最後から4番目のノードはcになります。
最初にリストの最後のノードまでトラバースし、再帰(バックトラッキング)増分カウントから戻ります。 countがNに等しい場合、結果として現在のノードへのポインタを返します。
このためのさまざまな入出力シナリオを見てみましょう-
入力 −リスト:-1→5→7→12→2→96→33 N =3
出力 −最後からn番目のノードは次のとおりです:2
説明 −最後から3番目のノードは2です。
入力 −リスト:-12→53→8→19→20→96→33 N =8
出力 −ノードが存在しません。
説明 −リストには7つのノードしかないため、最後から8番目のノードはありません。
以下のプログラムで使用されているアプローチは次のとおりです
このアプローチでは、最初に再帰を使用してリストの最後に到達し、バックトラック中に静的カウント変数をインクリメントします。 countが入力Nと等しくなるとすぐに、現在のノードポインタを返します。
-
intデータ部分とノードを次のポインタとして持つ構造体ノードを取ります。
-
関数addtohead(Node ** head、int data)は、ノードをヘッドに追加して、単一リンクリストを作成するために使用されます。
-
上記の関数を使用して、最初のノードへのポインタとしてheadを使用して、単一リンクリストを作成します。
-
関数display(Node * head)は、ヘッドノードから始まるリンクリストを印刷するために使用されます。
-
Nを正の整数とします。
-
関数findNode(Node * head、int n1)は、headとn1へのポインターを取り、最後からn1番目のノードが見つかったときに結果を出力します。
-
最後からn番目のノードへのポインタとして爆風を取ります。
-
searchNthLast(head、n1、&nlast)を呼び出して、そのノードを見つけます。
-
関数searchNthLast(Node * head、int n1、Node ** nlast)は、headを最初のノードとしてリンクリストの最後からn番目の最後のノードへのポインターを返します。
-
静的カウント変数を取得します。
-
headがNULLの場合、何も返しません。
-
tmp =head->nextを取ります。
-
searchNthLast(tmp、n1、nlast)を呼び出して、最後のノードまで再帰的にトラバースします。
-
その後、1ずつカウントします。
-
countがn1に等しくなる場合は、* nlast=headを設定します。
-
最後に、結果としてnlastが指すノードの値を出力します。
例
#include <bits/stdc++.h> using namespace std; struct Node { int data; Node* next; }; void addtohead(Node** head, int data){ Node* nodex = new Node; nodex->data = data; nodex->next = (*head); (*head) = nodex; } void searchNthLast(Node* head, int n1, Node** nlast){ static int count=0; if (head==NULL){ return; } Node* tmp=head->next; searchNthLast(tmp, n1, nlast); count = count + 1; if (count == n1){ *nlast = head; } } void findNode(Node* head, int n1){ Node* nlast = NULL; searchNthLast(head, n1, &nlast); if (nlast == NULL){ cout << "Node does not exists"; } else{ cout << "Nth Node from the last is: "<< nlast->data; } } void display(Node* head){ Node* curr = head; if (curr != NULL){ cout<<curr->data<<" "; display(curr->next); } } int main(){ Node* head = NULL; addtohead(&head, 20); addtohead(&head, 12); addtohead(&head, 15); addtohead(&head, 8); addtohead(&head, 10); addtohead(&head, 4); addtohead(&head, 5); int N = 2; cout<<"Linked list is :"<<endl; display(head); cout<<endl; findNode(head, N); return 0; }
出力
上記のコードを実行すると、次の出力が生成されます
Linked list is : 5 4 10 8 15 12 20 Nth Node from the last is: 12
-
C ++の2Dマトリックス(反復アプローチ)からリンクリストを作成します
行列が1つあるとすると、反復アプローチを使用して2Dリンクリストに変換する必要があります。リストには右ポインタと下ポインタがあります。 したがって、入力が次のような場合 10 20 30 40 50 60 70 80 90 出力はになります これを解決するには、次の手順に従います- real_head:=NULL サイズがmの配列head_arrを定義します。 初期化i:=0の場合、i
-
C++のリンクリストの代替ノードの合計
この問題では、リンクリストが表示されます。私たちのタスクは、リンクリストの代替ノードの合計を出力することです。 リンクリストは、リンクを介して相互に接続された一連のデータ構造です。 では、問題に戻りましょう。ここでは、リンクリストの代替ノードを追加します。これは、ノードが位置0、2、4、6、…であることを追加することを意味します 問題を理解するために例を見てみましょう。 入力 4 → 12 → 10 → 76 → 9 → 26 → 1 出力 24 説明 considering alternate strings