给定以下链表定义
typedef struct elemento {
int inf;
struct elemento *next;
} lista;
我正在尝试创建一个函数
lista *SeekAndDestroy(lista *p, int k);
给定一个列表 *p 和一个正整数 k,它在列表中搜索第一个连续元素序列,其总和恰好为 k,并从列表中删除这些元素。
我的尝试:
lista *SeekAndDestroy(lista *p, int k) {
lista *a, *nuovo;
int x = 0;
a = (lista *)malloc(sizeof(lista));
a->inf = p->inf;
nuovo = a;
p = p->next;
while (p != NULL) {
if (p->next != NULL) {
if ((p->inf + p->next->inf) == k) {
if (x != 1) {
p = p->next->next;
x = 1;
continue;
}
}
}
nuovo->next = (lista *)malloc(sizeof(lista));
nuovo = nuovo->next;
nuovo->inf = p->inf;
p = p->next;
}
nuovo->next = NULL;
return a;
}
我的解决方案有两个主要问题:
1) 最多删除两个连续的元素,不能更多
2)如果要删除的项目是前两项,该功能不起作用
我怎么解决这个问题?谢谢
最佳答案
现在,让我们忘掉链表和指针之类的东西。比如说,我们必须解决给定数组的问题。我们能做到吗?当然!
for (int i = 0; i < array.length; ++i) {
for (int j = i; j < array.length; ++j) {
int sum = getRangeSum(array, i, j);
if (sum != k) continue;
// construct new array and return
}
}
此代码可以进一步优化,但我们暂时保持简单。因此,在链表中,可以使用类似的方法。而删除部分也很简单。您可以保留一个变量来跟踪 i 的前一个节点。我们称它为iParent。现在,我们可以删除 [i, j] 段作为 iParent->next = j->next
。
显然,您需要考虑一些极端情况,例如是否找不到此类段,或者该段是否从链表的开头开始等。
关于c - 删除链表中的连续元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40449317/