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

C++の二重リンクリストで指定された合計のペアを検索します


この問題では、二重にリンクされたリストと値の合計が与えられます。私たちのタスクは、二重にリンクされたリストで特定の合計を持つペアを見つけることです。

問題を理解するために例を見てみましょう

入力

head − 2 <-> 5 <-> 6 <-> 9 <-> 12
x = 11

出力

(2, 9), (5, 6)

説明

For pairs (2, 9), the sum of values is 11
For pairs (5, 6), the sum of values is 11

ソリューションアプローチ

この問題の簡単な解決策は、リンクリスト全体をトラバースし、要素を1つずつ取得して、残りのリンクリストで合計が合計である要素を見つけることです。これは、ネストされたループを使用して行われます。

ソリューションの動作を説明するプログラム

#include<iostream>
using namespace std;
struct Node {
   int data;
   struct Node *next, *prev;
};
void findSumPairs(struct Node *head, int sum) {
   struct Node *first = head;
   int pairCount = 0;
   while (first != NULL) {
      struct Node *second = first -> next;
      while(second != NULL){
         if ((first->data + second->data) == sum) {
            pairCount++;
            cout<<"("<<first->data<<",
            "<<second->data<<")\n";
         }
         second = second -> next;
      }
      first = first -> next;
   }
   if (!pairCount)
      cout<<"No Such Pairs found !";
}
void insert(struct Node **head, int data) {
   struct Node *temp = new Node;
   temp->data = data;
   temp->next = temp->prev = NULL;
   if (!(*head))
      (*head) = temp;
   else{
      temp->next = *head;
      (*head)->prev = temp;
      (*head) = temp;
   }
}
int main() {
   struct Node *head = NULL;
   insert(&head, 12);
   insert(&head, 9);
   insert(&head, 6);
   insert(&head, 5);
   insert(&head, 2);
   int sum = 11;
   cout<<"Pair in the linked list with sum = "<<sum<<" :\n";
   findSumPairs(head, sum);
   return 0;
}

出力

Pair in the linked list with sum = 11 :
(2, 9)
(5, 6)

たまたまより効果的な別のアプローチは、リンクリストがソートされているという事実を使用することです。このために、2つのポインターを使用します。1つは最初にリンクリストの先頭を指し始めます。そして、もう一方の端は最初にリンクリストの最後のノードを指しています。

次に、sumValを見つけるために追加し、それを

と比較します。
given sum.
If sumVal > sum, move end pointer leftwards.
If sumVal < sum, move start pointer rightwards.
If sumVal == sum, print both values, move start pointer rightwards.

ポインタが交差すると、ループから抜け出します。また、見つかったペアの数をカウントします。0に等しい場合は、「そのようなペアは見つかりませんでした!」と出力します。

ソリューションの動作を説明するプログラム

#include<iostream>
using namespace std;
struct Node {
   int data;
   struct Node *next, *prev;
};
void findSumPairs(struct Node *head, int sum) {
   struct Node *start = head;
   struct Node *end = head;
   while (end->next != NULL)
      end = end->next;
   int pairCount = 0;
   while (start != NULL && end != NULL && start != end &&
   end->next != start) {
      if ((start->data + end->data) == sum) {
         pairCount++;
         cout<<"("<<start->data<<", "<<end->data<<")\n";
         start = start->next;
         end = end->prev;
      }
      else if ((start->data + end->data) < sum)
         start = start->next;
      else
         end = end->prev;
   }
   if (!pairCount)
      cout<<"No Such Pairs found !";
}
void insert(struct Node **head, int data) {
   struct Node *temp = new Node;
   temp->data = data;
   temp->next = temp->prev = NULL;
   if (!(*head))
      (*head) = temp;
   else{
      temp->next = *head;
      (*head)->prev = temp;
      (*head) = temp;
   }
}
int main() {
   struct Node *head = NULL;
   insert(&head, 12);
   insert(&head, 9);
   insert(&head, 6);
   insert(&head, 5);
   insert(&head, 2);
   int sum = 11;
   cout<<"Pair in the linked list with sum = "<<sum<<" :\n";
   findSumPairs(head, sum);
   return 0;
}

出力

Pair in the linked list with sum = 11 :
(2, 9)
(5, 6)

  1. C++の平衡二分探索木で与えられた合計を持つペアを見つけます

    平衡二分探索木とターゲット合計があるとすると、合計がターゲット合計に等しいペアであるかどうかをチェックするメソッドを定義する必要があります。この場合。二分探索木は不変であることに注意する必要があります。 したがって、入力が次のような場合 その場合、出力は(9 + 26 =35)になります。 これを解決するには、次の手順に従います- スタックs1、s2を定義する done1:=false、done2:=false val1:=0、val2:=0 curr1:=root、curr2:=root 無限ループ、実行- done1がfalseの場合、do − curr1が

  2. C++で二重リンクリストのサイズを見つけるプログラム

    この問題では、二重にリンクされたリストが与えられます。私たちのタスクは、C++で二重リンクリストのサイズを見つけるプログラムを作成することです。 二重リンクリストは特殊なタイプのリンクリストであり、単一リンクリストと比較して、順方向と逆方向の両方の方法で簡単にナビゲーションできます。以下は、二重リンクリストの概念を理解するための重要な用語です。 リンク-リンクリストの各リンクには、要素と呼ばれるデータを格納できます。 次へ-リンクリストの各リンクには、次と呼ばれる次のリンクへのリンクが含まれています。 前-リンクリストの各リンクには、前と呼ばれる前のリンクへのリンクが含ま