Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ลบ Zero Sum Consecutive Nodes ออกจากรายการที่เชื่อมโยงใน C ++


สมมติว่าเราได้ให้หัวหน้าของรายการที่เชื่อมโยง เราต้องลบลำดับของโหนดที่ต่อเนื่องกันซึ่งรวมเป็น 0 ซ้ำ ๆ จนกว่าจะไม่มีลำดับดังกล่าว หลังจากทำเช่นนั้น เราต้องกลับหัวของรายการเชื่อมโยงสุดท้าย ดังนั้นหากรายการเป็นแบบ [1,2,-3,3,1] ผลลัพธ์จะเป็น [3,1]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • สร้างโหนดที่เรียกว่า dummy และเก็บ 0 ไว้ ตั้งค่าถัดจาก dummy :=head

  • สร้างหนึ่งแผนที่ m เก็บจำลองสำหรับคีย์ 0 เป็น m ตั้งค่าผลรวม =0

  • ในขณะที่หัวไม่เป็นโมฆะ -

    • sum :=sum + ค่าของ head ตั้งค่า m[sum] :=head และ head :=ถัดไปของ head

  • หัว :=โง่

  • ผลรวม :=0

  • ในขณะที่หัวไม่เป็นโมฆะ

    • sum :=sum + มูลค่าของหัว

    • อุณหภูมิ :=m[sum]

    • ถ้า temp ไม่ใช่ head ก็ next of head :=next of temp

    • head :=ข้างหัว

  • กลับมาต่อจากดัมมี่

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#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]