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的,则外层循环又向后移动一位,重复进行
原文地址:https://www.cnblogs.com/zmmm/p/13617185.html