LeetCode 1171. 从链表中删去总和值为零的连续节点 | C语言版

LeetCode 1171. 从链表中删去总和值为零的连续节点 | C语言版

    • NowCoder Offer 1171. 从链表中删去总和值为零的连续节点
      • 题目描述
      • 解题思路
        • 思路一:使用双指针
          • 代码实现
          • 运行结果
          • 参考文章:
        • 思路二:减少遍历节点数
          • 代码实现
          • 运行结果
          • 参考文章:[]()

NowCoder Offer 1171. 从链表中删去总和值为零的连续节点

题目描述

题目地址:1171. 从链表中删去总和值为零的连续节点

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

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

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

(注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。)
LeetCode 1171. 从链表中删去总和值为零的连续节点 | C语言版_第1张图片

解题思路

思路一:使用双指针

代码实现
/**
 * 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;
}
运行结果

LeetCode 1171. 从链表中删去总和值为零的连续节点 | C语言版_第2张图片

参考文章:

https://leetcode.cn/problems/remove-zero-sum-consecutive-nodes-from-linked-list/solutions/57658/cyu-yan-zeng-jia-1ge-qian-qu-jie-dian-by-wpy101001/?orderBy=most_votes&languageTags=cpp%2Cc

思路二:减少遍历节点数

代码实现
在这里插入代码片
运行结果
参考文章:

在这里插入图片描述

你可能感兴趣的:(算法,链表,leetcode,c语言)