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

C++のソートされたリンクリストで中央値を見つける


この問題では、N個の要素で構成されるソートされたリンクリストが与えられます。私たちのタスクは、並べ替えられたリンクリストの中央値を見つけることです。 。

ソートされたリンクリスト は、すべての要素が特定の順序でソートされている単純なリンクリストです。 − 4-> 6-> 7-> 9-> NULL

中央値 リンクリストの中央の要素です。 Nが奇数であるかのように見つけることができます:中央値は(n / 2) th 要素

Nが偶数の場合-s中央値は(n / 2) th の平均です 要素と(n / 2 + 1) th 要素。

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

Input: 2 -> 3 -> 4 -> 6 -> 9 -> NULL
Output: 4

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

この問題の簡単な解決策は、リンクリストのすべての要素をトラバースしてカウントすることです。

ここで、カウントが奇数の場合、リンクリストのN/2番目の要素までリンクリストを再度トラバースします。

カウントが偶数の場合、N/2番目の要素とN/2 + 1番目の要素までトラバースし、それらを加算して2で除算します。

代替アプローチ

この問題を解決する別のアプローチは、2つのポインタートラバーサルを使用してリンクリストをトラバースし、リンクリストの要素の数を見つけることです。

これは、要素の数を数えずに中央値を見つけるためのアルゴリズムです。それらは、条件に基づいて、pointer1とpointer2の2つのポインターです。

ポインター1がNULLでない場合、ポインター2は中央値です。

ポインター1がNULLの場合、(ポインター2のノードの前+ポインター2->データ)/2。

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

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node* next;
};
void findMedianValue(Node* head){
   Node* ptr1 = head;
   Node* ptr2 = head;
   Node* prev = head;
   if (head != NULL) {
      while (ptr2 != NULL && ptr2->next != NULL) {
         ptr2 = ptr2->next->next;
         prev = ptr1;
         ptr1 = ptr1->next;
      }
      if (ptr2 != NULL)
         cout<<ptr1->data;
      else
         cout<<float(ptr1->data + prev->data) / 2;
   }
}
void pushVal(struct Node** head_ref, int new_data){
   Node* new_node = new Node;
   new_node->data = new_data;
   new_node->next = (*head_ref);
   (*head_ref) = new_node;
}
int main(){
   struct Node* head = NULL;
   pushVal(&head, 3);
   pushVal(&head, 5);
   pushVal(&head, 6);
   pushVal(&head, 8);
   pushVal(&head, 9);
   pushVal(&head, 11);
   cout<<"The median of the linked list is ";
   findMedianValue(head);
   return 0;
}

出力

The median of the linked list is 7

  1. C++でソートおよびローテーションされたリンクリストのローテーションをカウントします

    リンクリストが表示されます。リストは最初にソートされ、次にK個のノードでローテーションされます。目標は、Kの値を見つけることです。K個のノードだけ回転する入力としてリンクリストを以下に示す場合- それならオリジナルは-だったに違いない ここでKは2であることがわかります。入力リンクリストは、元のソートされたリンクリストの2ノードのローテーションです。 例を挙げて理解しましょう。 入力 −リスト:5→7→9→1→3 出力 リンクリストの要素は次のとおりです。5791 3 ソートおよびローテーションされたリンクリストのローテーション数は-3 説明 −元のソート済み

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

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