LeetCode 1171. 从链表中删去总和值为零的连续节点 | C语言版
NowCoder Offer 1171. 从链表中删去总和值为零的连续节点
题目描述
给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。
删除完毕后,请你返回最终结果链表的头节点。
你可以返回任何满足题目要求的答案。
(注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。)
解题思路
思路一:使用双指针
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeZeroSumSublists(struct ListNode* head){
//创建虚拟节点
struct ListNode* hummyHead=(struct ListNode*)malloc(sizeof(struct ListNode));
hummyHead->val=0;
hummyHead->next=head;
struct ListNode* p=hummyHead;
//例一:hummyHead(p)(0)->1(q)->2(q)->-3(q)->3->1->NULL
//例二:hummyHead(p)(0)->1->2(q)->3(q)->-3(q)->-2(q)->NULL
//例三:hummyHead(p)(0)->1->2->3(q)->-3(q)->4->NULL
while(p){
int sum=0;
struct ListNode* q=p->next;
while(q){
sum+=q->val;
if(sum==0){
//删除sum=0的序列段(q...q)
p->next=q->next;
}
q=q->next;
}
p=p->next;
}
//例一:p=0,sum=1+2+-3=0,sum=3+1 hummyHead(p)(0)->3->1->NULL
//例二:p=0,1+2+3+-3+-2=1;p=1,sum=2+3+-3+-2=0 hummyHead(p)(0)->1->NULL
//例三:p=0,1+2+3+-3+4=7;p=1,sum=2+3+-3+4=6;p=2,sum=3+-3=0,sum=4; hummyHead(p)(0)->1->2->4->NULL
return hummyHead->next;
}
运行结果
参考文章:
思路二:减少遍历节点数
代码实现
在这里插入代码片