解题思路
核心是添加一个头结点。
要删去总和值为零的连续链表结点,只需维护每一个结点之前的所有和,此时如果该结点与前面结点的和相加结果为0,则该节点就可以抵消前面的结点,消除的时候就是把next指向和的下一个结点,重复该过程,直到整个链表求解结束。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeZeroSumSublists(struct ListNode* head){
// 带头结点
struct ListNode* newhead = (struct ListNode*)malloc(sizeof(struct ListNode));
newhead->next = head;
struct ListNode* p = newhead, *q = NULL;
while(p)
{
q = p->next;
int sum = 0;
while(q)
{
sum += q->val;
if(sum == 0)
{
struct ListNode* start = p->next;
p->next = q->next;
while(start != p->next)
{
struct ListNode* tmp = start->next;
free(start);
start = tmp;
}
q = p;
}
q = q->next;
}
p =p->next;
}
head = newhead->next;
free(newhead);
return head;
}