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

    技术2026-02-16  16

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

    问题描述: 给你一个链表的头节点 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.

    输入说明: 首先输入链表长度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 *la=new ListNode; la->next=head; ListNode *pre=la; ListNode *p=head,*q; int num=0,flag=0; if(head->val==0&&head->next->val==0){ return NULL; } while(p){ if(p->val==0){ pre->next=p->next; p=pre->next; }else{ pre=pre->next; p=p->next; } } pre=la; p=pre->next; while(p!=NULL){ num=p->val; flag=0; q=p->next; while(q!=NULL){ num=q->val+num; if(num==0){ pre->next=q->next; p=pre->next; flag=1; break; } q=q->next; } if(flag==0){ pre=pre->next; p=p->next; } } return la->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\n"; } int main(){ ListNode* head = createByTail(); head=Solution().removeZeroSumSublists(head); displayLink(head); return 0; }
    Processed: 0.014, SQL: 9