/**
* @param {ListNode} head
* @return {ListNode}
*/
const { ListNode } = require('./utils.js')
// https://leetcode.com/problems/remove-zero-sum-consecutive-nodes-from-linked-list/discuss/366350/C%2B%2B-O(n)-(explained-with-pictures)
var removeZeroSumSublists = function (head) {
const root = new ListNode(0),
map = { 0: root }
let accumulative = 0
root.next = head
while (head !== null) {
accumulative += head.val
if (map[accumulative]) {
let prev = map[accumulative],
start = prev,
aux = accumulative
while (prev !== head) {
prev = prev.next
aux += prev.val
if (prev !== head) delete map[aux]
}
start.next = head.next
} else {
map[accumulative] = head
}
head = head.next
}
return root.next
}