《leetcode刷题讲解》—漫漫编程路

目录

1.问题描述

2.代码及解析


1.问题描述

leetcode 1171.从链表中删去总和值为零的连续节点(难度:mid)

给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。

删除完毕后,请你返回最终结果链表的头节点。

你可以返回任何满足题目要求的答案。

(注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。)

来源:力扣(LeetCode)
链接:1171. 从链表中删去总和值为零的连续节点 - 力扣(LeetCode) (leetcode-cn.com)

《leetcode刷题讲解》—漫漫编程路_第1张图片

 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时,我们则将这一段连续节点删除,此方法想到不难,但要注意操作细节,每一步都要注意。

本文到此结束,感谢大家的阅读,欢迎大家点赞评论互关,祝大家万事如意。

你可能感兴趣的:(leetcode,算法,职场和发展)