• 9 从链表中删去总和值为零的连续节点(1171)


    作者: Turbo时间限制: 1S章节: DS:数组和链表

    晚于: 2020-07-08 12:00:00后提交分数乘系数50%

    截止日期: 2020-07-15 12:00:00

    问题描述 :

    给你一个链表的头节点 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指向无头结点单链表,返回结果链表的头指针。

    输入说明 :

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

    输出说明 :

    输出格式见范例

    输入范例 :

    5
    1 2 -3 3 1

    输出范例:

    head-->3-->1-->tail
    #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 *p = new ListNode(0);//自己添加一个头结点 
            ListNode *pre=p;//把头节点赋值给pre,因为p会面会变化,pre用来保存头结点 
            p->next=head;//实现头结点 
            while(p!=NULL)
            {
                int sum=0;
                ListNode *temp=p->next;//从第一个结点 开始判断 
                while(temp!=NULL)
                {
                    sum=sum+temp->val;
                    temp=temp->next;
                    if(sum==0)//如果符合,下面直接删除,并且跳出循环 
                    {
                        p->next=temp;
                        break;
                    }
                }
    
                if(temp==NULL)//如果一直不为0,从下个节点开始找 
                    p=p->next;
            }
            return pre->next;
        }
    };
    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
    ";
    }
    int main()
    {
        ListNode* head = createByTail();
        head=Solution().removeZeroSumSublists(head);
        displayLink(head);
        return 0;
    }
    //内层循环是从头开始计算节点值之和,如果为0,立马改变指针,如果指针移动到末尾都没有等于0的,则外层循环又向后移动一位,重复进行
  • 相关阅读:
    软件开发人员的简历项目经验怎么写?
    mapreduce 多种输入
    lnmp如何实现伪静态,默认目录伪静态
    LNMP环境中WordPress程序伪静态解决方案
    wordpress必装的插件 wp最常用的十个插件
    debian系统下改语言设置
    Centos7 开启端口
    EventProcessor与WorkPool用法--可处理多消费者
    Disruptor入门
    Disruptor初级入门
  • 原文地址:https://www.cnblogs.com/zmmm/p/13617185.html
Copyright © 2020-2023  润新知