作者:
晚于: 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的,则外层循环又向后移动一位,重复进行