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

C++のリンクリストからゼロサム連続ノードを削除する


リンクリストの先頭を指定したとします。そのようなシーケンスがなくなるまで、合計が0になるノードの連続するシーケンスを繰り返し削除する必要があります。したがって、そうした後、最終的なリンクリストの先頭を返す必要があります。したがって、リストが[1,2、-3,3,1]のような場合、結果は[3,1]になります。

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

  • ダミーと呼ばれるノードを作成し、そこに0を格納し、ダミーの次を設定します:=head

  • 1つのマップmを作成し、キー0のダミーをmに格納し、sum=0に設定します

  • 頭がヌルではない間-

    • sum:=sum +ヘッドの値、m [sum]:=ヘッド、およびヘッド:=ヘッドの次を設定

  • 頭:=ダミー

  • 合計:=0

  • 頭がヌルではない間

    • 合計:=合計+ヘッドの値

    • temp:=m [sum]

    • tempがheadでない場合は、next of head:=next of temp

    • 頭:=頭の次

  • ダミーの次を返す

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

#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){
      cout << ptr->val << ", ";
      ptr = ptr->next;
   }
   cout << "]" << endl;
}
class Solution {
   public:
   ListNode* removeZeroSumSublists(ListNode* head) {
      ListNode* dummy = new ListNode(0);
      dummy->next = head;
      unordered_map <int, ListNode*> m;
      m[0] = dummy;
      int sum = 0;
      while(head){
         sum += head->val;
         m[sum] = head;
         head = head->next;
      }
      head = dummy;
      sum = 0;
      while(head){
         sum += head->val;
         ListNode* temp = m[sum];
         if(temp != head){
            head->next = temp->next;
         }
         head = head->next;
      }
      return dummy->next;
   }
};
main(){
   vector<int> v1 = {1,2,-3,3,1};
   ListNode *head = make_list(v1);
   Solution ob;
   print_list(ob.removeZeroSumSublists(head));
}

入力

[1,2,-3,3,1]

出力

[3,1]

  1. C++の循環リンクリストでノードをカウントします

    ノードを含む循環リンクリストが与えられ、タスクは循環リンクリストに存在するノードの数を計算することです。 循環リンクリストは、最初の要素が最後の要素を指し、最後の要素が最初の要素を指すリンクリストのバリエーションです。単一リンクリストと二重リンクリストの両方を循環リンクリストにすることができます。 以下のプログラムでは、単一リンクリストを循環リンクリストとして実装し、その中のノード数を計算しています。 例 Input − nodes-: 20, 1, 2, 3, 4, 5 Output − count of nodes are-: 6 Input &minus

  2. C ++で再帰を使用して、リンクリストの代替ノードを出力します

    リンクリストは、要素を連続していないメモリ位置に格納する線形データ構造です。すべての要素には、リンクリストの次の要素へのポインタが含まれています。 例 − この問題では、リンクリストが与えられ、このリンクリストの要素を印刷する必要がありますが、代替要素のみが印刷されます。問題をよりよく理解するために例を見てみましょう。 Input : 2 -> 4 -> 1 -> 67 -> 48 -> 90 Output : 2 -> 1 -> 48 説明 −リンクリストに代替要素を出力します。したがって、1番目、3番目、5番目の要素が印刷されます。