力扣练习——9 从链表中删去总和值为零的连续节点

1.问题描述

给你一个链表的头节点 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]

 

 

说明:

给你的链表中可能有 1 到 1000 个节点。

对于链表中的每个节点,节点的值:-1000 <= node.val <= 1000.

 

可使用以下代码,完成其中的removeZeroSumSublists函数,其中形参head指向无头结点单链表,返回结果链表的头指针。

#include<iostream>

#include<vector>

using namespace std;

 

struct ListNode

{

    int val;

    ListNode *next;

    ListNode() : val(0), next(NULL) {}

    ListNode(int x) : val(x), next(NULL) {}

    ListNode(int x, ListNode *next) : val(x), next(next) {}

};

class Solution {

public:

    ListNode* removeZeroSumSublists(ListNode* head) {

             //填充本函数完成功能  

    }

};

ListNode *createByTail()

{

    ListNode *head;

    ListNode *p1,*p2;

    int n=0,num;

    int len;

    cin>>len;

    head=NULL;

    while(n<len && cin>>num)

    {

        p1=new ListNode(num);

        n=n+1;

        if(n==1)

            head=p1;

        else

            p2->next=p1;

        p2=p1;

    }

    return head;

}

void  displayLink(ListNode *head)

{

    ListNode *p;

    p=head;

    cout<<"head-->";

    while(p!= NULL)

    {

        cout<<p->val<<"-->";

        p=p->next;

    }

    cout<<"tail\n";

}

int main()

{

    ListNode* head = createByTail();

    head=Solution().removeZeroSumSublists(head);

    displayLink(head);

    return 0;

}

 2.输入说明

首先输入链表长度len,然后输入len个整数,以空格分隔。

3.输出说明

输出格式见范例

4.范例

输入

5
1 2 -3 3 1

输出

head-->3-->1-->tail

5.代码

复制代码
#include<iostream>

#include<vector>

using namespace std;



struct ListNode

{

    int val;

    ListNode *next;

    ListNode() : val(0), next(NULL) {}

    ListNode(int x) : val(x), next(NULL) {}

    ListNode(int x, ListNode *next) : val(x), next(next) {}

};

class Solution {

public:

    ListNode* removeZeroSumSublists(ListNode* head) {

        //输入:
        //5
        //1 2 - 3 3 1
        //输出:
        //head-->3-->1-->tail
        struct ListNode* nhead = (struct ListNode*)malloc(sizeof(struct ListNode));//这里需要增加一个头结点,初始值为0
        nhead->next = head;
        nhead->val = 0;
        struct ListNode *p , *q;
        p = nhead;
        int x = 0;//记录每位结点的累计差
        while (p) {
            q = p->next;
            while (q) {

                x -= q->val;//重点!

                if (x == 0) {
                    p->next = q->next;
                }
                q = q->next;
            }
            p = p->next;
            x = 0;//每次新的结点开始时,都要将x设置为0
        }
        return nhead->next;
    }

};

ListNode *createByTail()

{

    ListNode *head;

    ListNode *p1, *p2=NULL;

    int n = 0, num;

    int len;

    cin >> len;

    head = NULL;

    while (n<len && cin >> num)

    {

        p1 = new ListNode(num);

        n = n + 1;

        if (n == 1)

            head = p1;

        else

            p2->next = p1;

        p2 = p1;

    }

    return head;

}

void  displayLink(ListNode *head)

{

    ListNode *p;

    p = head;

    cout << "head-->";

    while (p != NULL)

    {

        cout << p->val << "-->";

        p = p->next;

    }

    cout << "tail\n";

}

int main()

{

    ListNode* head = createByTail();

    head = Solution().removeZeroSumSublists(head);

    displayLink(head);

    return 0;

}
复制代码

 

posted @   努力奋斗的小企鹅  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示