力扣练习——9 从链表中删去总和值为零的连续节点
1.问题描述
给你一个链表的头节点 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指向无头结点单链表,返回结果链表的头指针。
#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 *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;
}
2.输入说明
首先输入链表长度len,然后输入len个整数,以空格分隔。
3.输出说明
输出格式见范例
4.范例
输入
5
1 2 -3 3 1
输出
head-->3-->1-->tail
5.代码
#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) { //输入: //5 //1 2 - 3 3 1 //输出: //head-->3-->1-->tail struct ListNode* nhead = (struct ListNode*)malloc(sizeof(struct ListNode));//这里需要增加一个头结点,初始值为0 nhead->next = head; nhead->val = 0; struct ListNode *p , *q; p = nhead; int x = 0;//记录每位结点的累计差 while (p) { q = p->next; while (q) { x -= q->val;//重点! if (x == 0) { p->next = q->next; } q = q->next; } p = p->next; x = 0;//每次新的结点开始时,都要将x设置为0 } return nhead->next; } }; ListNode *createByTail() { ListNode *head; ListNode *p1, *p2=NULL; 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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】