目录
1.问题描述
2.代码及解析
1.问题描述
leetcode 1171.从链表中删去总和值为零的连续节点(难度:mid)
给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。
删除完毕后,请你返回最终结果链表的头节点。
你可以返回任何满足题目要求的答案。
(注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。)
来源:力扣(LeetCode)
链接:1171. 从链表中删去总和值为零的连续节点 - 力扣(LeetCode) (leetcode-cn.com)
2.代码及解析
struct ListNode* removeZeroSumSublists(struct ListNode* head)
{
struct ListNode* pre = (struct ListNode*)malloc(sizeof(struct ListNode));
pre->next = head;
struct ListNode* p = pre;
while (p)
{
int sum = 0;
struct ListNode* q = p->next;
while (q)
{
sum += q->val;
if (sum == 0)
{
//释放被删除的节点
struct ListNode *del = p->next;
p->next = q->next;
while(del != p->next)
{
struct ListNode *tmp = del;
del = del->next;
free(tmp);
}
q = p->next;
}
else
q = q->next;
}
p = p->next;
}
head = pre->next;
free(pre);
return head;
}
本题根据题目要求,我们要删除和为0的连续节点,我们想到这样一个办法。
我们使用两层循环,外层循环从头开始,内层循环从外循环节点的下一个节点开始,使用一个sum记录此层内循环的值,当sum==0时,我们则将这一段连续节点删除,此方法想到不难,但要注意操作细节,每一步都要注意。
本文到此结束,感谢大家的阅读,欢迎大家点赞评论互关,祝大家万事如意。