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

C++を使用して二重リンクリストを逆にする


この記事では、二重リンクリストがあり、C++で二重リンクリストを逆にするさまざまなアプローチについて説明します。例-

Input : {1, 2, 3, 4}
Output : {4, 3, 2, 1}

一般的に頭に浮かぶアプローチは1つですが、通常のアプローチと非正統的なアプローチの2つのアプローチを使用します。

通常のアプローチ

このアプローチでは、リストを確認し、リストを確認しながら、リストを逆にします。

#include <bits/stdc++.h>

using namespace std;

class Node {
   public:
   int data;
   Node *next;
   Node *prev;
};

void reverse(Node **head_ref) {
   auto temp = (*head_ref) -> next;
   (*head_ref) -> next = (*head_ref) -> prev;
   (*head_ref) -> prev = temp;
   if(temp != NULL) {
      (*head_ref) = (*head_ref) -> prev;
      reverse(head_ref);
   }
   else
      return;
}
void push(Node** head_ref, int new_data) {
   Node* new_node = new Node();
   new_node->data = new_data;

   new_node->prev = NULL;

   new_node->next = (*head_ref);
   if((*head_ref) != NULL)
      (*head_ref) -> prev = new_node ;

   (*head_ref) = new_node;
}
int main() {
   Node* head = NULL;
   push(&head, 6);
   push(&head, 4);
   push(&head, 8);
   push(&head, 9);
   auto node = head;
   cout << "Before\n" ;
   while(node != NULL) {
      cout << node->data << " ";
      node = node->next;
   }
   cout << "\n";
   reverse(&head);
   node = head;
   cout << "After\n";
   while(node != NULL) {
      cout << node->data << " ";
   node = node->next;
   }
   return 0;
}

出力

Before
9 8 4 6
After
6 4 8 9

このアプローチにはO(N)が必要です 時間計算量は非常に優れています。この複雑さは、より高い制約で実行できるためです。

非正統的なアプローチ

名前が示すように、ユーザーの頭に浮かぶのはあまり一般的なアプローチではありませんが、このアプローチについても検討します。このアプローチでは、スタックを作成してデータをプッシュし続け、ポップしながら実行します。値を変更します。

#include <bits/stdc++.h>

using namespace std;

class Node {
   public:
   int data;
   Node *next;
   Node *prev;
};
void push(Node** head_ref, int new_data) {
   Node* new_node = new Node();
   new_node->data = new_data;

   new_node->prev = NULL;

   new_node->next = (*head_ref);
   if((*head_ref) != NULL)
      (*head_ref) -> prev = new_node ;

   (*head_ref) = new_node;
}
int main() {
   Node* head = NULL;
   push(&head, 6);
   push(&head, 4);
   push(&head, 8);
   push(&head, 9);
   auto node = head;
   cout >> "Before\n" ;
   while(node != NULL) {
      cout >> node->data >> " ";
      node = node->next;
   }
   cout >> "\n";
   stack<Node*> s;
   node = head;
   while(node) {
      head = node;
      s.push(node);
      node = node -> next;
   }
   while(!s.empty()) {
      auto x = s.top();
      auto temp = x -> prev;
      x -> prev = x -> next;
      x -> next = temp;
      s.pop();
   }
   node = head;
   cout << "After\n";
   while(node != NULL) {
      cout << node->data << " ";
   node = node->next;
   }
   return 0;
}

出力

Before
9 8 4 6
After
6 4 8 9

上記のコードの説明

このアプローチでは、リストをトラバースしながら埋めるスタックを使用し、次にスタックからアイテムをポップして、リストが逆になるように値を変更します。 O(N)はこのプログラムの時間計算量であり、より高い制約にも適しています。

結論

この記事では、スタックの有無にかかわらず、二重にリンクされたリストを逆にする問題を解決します。 O(N)の時間計算量では、Nはリストのサイズです。また、この問題のC ++プログラムと、この問題を解決するための完全なアプローチ(NormalおよびUnorthodox)についても学習しました。同じプログラムをC、java、python、その他の言語などの他の言語で作成できます。この記事がお役に立てば幸いです。


  1. C++で二重にリンクされた循環リスト

    循環リンクリストは、最初の要素が最後の要素を指し、最後の要素が最初の要素を指すリンクリストのバリエーションです。単一リンクリストと二重リンクリストの両方を循環リンクリストにすることができます。 二重リンクリストでは、最後のノードの次のポインタが最初のノードを指し、最初のノードの前のポインタが最後のノードを指し、両方向に循環します。 上の図のように、考慮すべき重要なポイントは次のとおりです。 最後のリンクの次は、二重リンクリスト内のリストの最初のリンクを指します。 最初のリンクの前のポイントは、二重にリンクされたリストの最後を指します。 アルゴリズム displayFo

  2. C++で二重にリンクされたリストを使用した優先キュー

    データと優先度は整数値として与えられ、タスクは与えられた優先度に従って二重にリンクされたリストを作成し、結果を表示することです。 キューはFIFOデータ構造であり、最初に挿入された要素が最初に削除されます。優先度付きキューは、優先度に応じて要素を挿入または削除できるキューの一種です。キュー、スタック、またはリンクリストのデータ構造を使用して実装できます。優先キューは、次のルールに従って実装されます- 優先度が最も高いデータまたは要素は、優先度が最も低いデータまたは要素の前に実行されます。 2つの要素の優先度が、順番に実行される要素と同じである場合、それらはリストに追加されます。 優先