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+ 次查看

启动您的 职业生涯

通过完成课程获得认证

开始
广告

© . All rights reserved.