C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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

  1. C ++の2Dマトリックス(反復アプローチ)からリンクリストを作成します

    行列が1つあるとすると、反復アプローチを使用して2Dリンクリストに変換する必要があります。リストには右ポインタと下ポインタがあります。 したがって、入力が次のような場合 10 20 30 40 50 60 70 80 90 出力はになります これを解決するには、次の手順に従います- real_head:=NULL サイズがmの配列head_arrを定義します。 初期化i:=0の場合、i

  2. C++のリンクリストの代替ノードの合計

    この問題では、リンクリストが表示されます。私たちのタスクは、リンクリストの代替ノードの合計を出力することです。 リンクリストは、リンクを介して相互に接続された一連のデータ構造です。 では、問題に戻りましょう。ここでは、リンクリストの代替ノードを追加します。これは、ノードが位置0、2、4、6、…であることを追加することを意味します 問題を理解するために例を見てみましょう。 入力 4 → 12 → 10 → 76 → 9 → 26 → 1 出力 24 説明 considering alternate strings