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

C++のパーティションリスト


リンクリストと値xがあるとします。パーティションを作成する必要があります。 x未満のすべてのノードがx以上のノードの前に来るように分割します。これら2つのパーティションのそれぞれのノードの元の相対的な順序を保持する必要があります。したがって、リストが[1,4,3,2,5,2]のようで、x =3の場合、出力は[1,2,2,4,3,5]

になります。

これを解決するには、次の手順に従います-

  • ダミーノードd1とd2を作成し、それらを-1で初期化し、2つのポインターdp1とdp2を作成します。これらは、それぞれd1とd2を指しています。
  • aがnullではない場合
    • の値の場合
    • dp1の次:=値がaの新しいノード
    • dp1:=dp1の次のポインタ
  • それ以外の場合
    • dp2の次:=値がaの新しいノード
    • dp2:=dp2の次のポインタ
  • a:=次のa
  • dp1の次:=d2の次
  • d1の次を返す
  • 例(C ++)

    理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    class ListNode{
       public:
          int val;
          ListNode *next;
          ListNode(int data){
             val = data;
             next = NULL;
          }
    };
    ListNode *make_list(vector<int> v){
       ListNode *head = new ListNode(v[0]);
       for(int i = 1; i<v.size(); i++){
          ListNode *ptr = head;
          while(ptr->next != NULL){
             ptr = ptr->next;
          }
          ptr->next = new ListNode(v[i]);
       }
       return head;
    }
    void print_list(ListNode *head){
       ListNode *ptr = head;
       cout << "[";
       while(ptr->next){
          cout << ptr->val << ", ";
          ptr = ptr->next;
       }
       cout << "]" << endl;
    }
    class Solution {
    public:
       ListNode* partition(ListNode* a, int b) {
          ListNode* dummy1 = new ListNode(-1);
          ListNode* dummy2 = new ListNode(-1);
          ListNode* dummyPtr1 = dummy1;
          ListNode* dummyPtr2 = dummy2;
          while(a){
             if(a->val < b){
                dummyPtr1->next = new ListNode(a->val);
                dummyPtr1 = dummyPtr1->next;
             }
             else{
                dummyPtr2->next = new ListNode(a->val);
                dummyPtr2 = dummyPtr2->next;
             }
             a = a->next;
          }
          dummyPtr1->next = dummy2->next;
          return dummy1->next;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {1,4,6,3,2,5,2,8};
       ListNode *head = make_list(v);
       print_list(ob.partition(head, 3));
    }

    入力

    [1,4,6,3,2,5,2,8]
    3

    出力

    [1, 2, 2, 4, 6, 3, 5, ]

    1. C++の次の大きな要素

      次に大きい要素は、その次の最初の大きい要素です。例を見てみましょう。 arr =[4、5、3、2、1] 4の次に大きい要素は5であり、要素3、2、1の次に大きい要素は-1です。これは、それらの後に大きい要素がないためです。 アルゴリズム 乱数で配列を初期化します。 スタックを初期化します。 スタックに最初の要素を追加します。 配列の要素を繰り返し処理します。 スタックが空の場合は、現在の要素をスタックに追加します。 現在の要素がスタックの最上位の要素よりも大きい間。 一番上の要素を、次に大きい要素を現在の要素として印刷します。 一番上の要素

    2. C++でランダムポインタを使用してリストをコピーする

      リンクリストは線形データ構造であり、各ノードには2つのブロックがあり、一方のブロックにはノードの値またはデータが含まれ、もう一方のブロックには次のフィールドのアドレスが含まれます。 各ノードにリスト内の他のノードを指すランダムポインタが含まれるようなリンクリストがあると仮定します。タスクは、元のリストと同じリストを作成することです。ランダムなポインタを持つ元のリストからリストをコピーすることを、リンクリストの「ディープコピー」と呼びます。 例 入力-1 出力: 5-> 2 -> 3 -> 7 ->4 -> 説明: この問題を解決するためのア