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

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

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeZeroSumSublists(ListNode* head) {
    如果链表只有一个结点,并且值是0,返回空
       if(head->val==0&&head->next==NULL)
           return NULL;
     在进行操作时,链表的头结点有可能会改变,所以设置一个新的结点指针node,指向链表的头结点
        ListNode *node=new ListNode();
        node->next=head;
        ListNode *p=head,*pre=node,*q;
        先删除链表中结点的val值==0的结点
        while(p){
            if(p->val==0){
                pre->next=p->next;
                p=p->next;
            }
            else{
                pre=p;
                p=p->next;
            }       
        }
        p=node->next;
        pre=node;
        int sum;
        从头开始扫描,
        sum==0时,说明从p结点开始到q结点结束的这几个结点和为0,进行删除操作,p指向q的下一个结点,然后跳出循环
        sum不为0,q就一直后移,直到q为空,
        q为空时,pre指针和p指针都后移到下一个结点
        
        while(p!=NULL){
            sum=p->val;
            q=p->next;
            while(q!=NULL){
                sum+=q->val;
                if(sum==0){
                    pre->next=q->next;
                    p=q->next;
                    break;
                }
                else{
                    q=q->next;
                }
                }
            if(q==NULL){
                    pre=p;
                    p=p->next;
        } 
            }
        return node->next;
    }   
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值