C++ 中從連結串列中移除零和連續節點


假設我們給出了一個連結串列的頭節點;我們必須重複刪除總和為 0 的連續節點序列,直到沒有這樣的序列為止。因此,在這樣做之後,我們必須返回最終連結串列的頭節點。因此,如果列表類似於 [1,2,-3,3,1],則結果將為 [3,1]。

為了解決這個問題,我們將遵循以下步驟 -

  • 建立一個名為 dummy 的節點,並將 0 儲存到其中,設定 dummy 的 next := head

  • 建立一個 map m,將鍵 0 的 dummy 儲存到 m 中,設定 sum = 0

  • 當 head 不為空時 -

    • sum := sum + head 的值,設定 m[sum] := head,以及 head := head 的 next

  • head := dummy

  • sum := 0

  • 當 head 不為空時

    • sum := sum + head 的值

    • temp := m[sum]

    • 如果 temp 不是 head,則 head 的 next := temp 的 next

    • head := head 的 next

  • 返回 dummy 的 next

讓我們看看下面的實現,以便更好地理解 -

示例

 線上演示

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

更新於: 2020-04-30

2K+ 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告