问题描述:
给你一个链表的头节点 head,请你编写代码,反复删去链表中由总和值为 0 的连续节点组成的序列,直到不存在这样的序列为止。如果存在多个总和值为0的连续节点序列,优先删除位置靠前的序列。
删除完毕后,请你返回最终结果链表的头节点。
示例 1:
输入:head = [1,2,-3,3,1]
输出:[3,1]
提示:答案 [1,2,1] 不正确。
示例 2:
输入:head = [1,2,3,-3,4]
输出:[1,2,4]
示例 3:
输入:head = [1,2,3,-3,-2]
输出:[1]
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeZeroSumSublists(ListNode* head) {
如果链表只有一个结点,并且值是0,返回空
if(head->val==0&&head->next==NULL)
return NULL;
在进行操作时,链表的头结点有可能会改变,所以设置一个新的结点指针node,指向链表的头结点
ListNode *node=new ListNode();
node->next=head;
ListNode *p=head,*pre=node,*q;
先删除链表中结点的val值==0的结点
while(p){
if(p->val==0){
pre->next=p->next;
p=p->next;
}
else{
pre=p;
p=p->next;
}
}
p=node->next;
pre=node;
int sum;
从头开始扫描,
sum==0时,说明从p结点开始到q结点结束的这几个结点和为0,进行删除操作,p指向q的下一个结点,然后跳出循环
sum不为0,q就一直后移,直到q为空,
q为空时,pre指针和p指针都后移到下一个结点
while(p!=NULL){
sum=p->val;
q=p->next;
while(q!=NULL){
sum+=q->val;
if(sum==0){
pre->next=q->next;
p=q->next;
break;
}
else{
q=q->next;
}
}
if(q==NULL){
pre=p;
p=p->next;
}
}
return node->next;
}
};