c - 删除链表中的连续元素

标签 c algorithm linked-list

给定以下链表定义

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/

相关文章:

c - Id2sym & symbol.object_id

java - 生成特定的数字序列

java - 基于Java中的类变量对用户定义对象的2个LinkedList进行自定义排序

java - 如何在 Java 中的 Stack/Queue 类中实现通用 LinkedList

计算船上所有棋子离开所需步数的算法

java - 如何将对象添加到链表中?

c - printf 数组的整个单元

c - 将第一个字节设置为 0 或使用 memset 到 "reset"整个缓冲区

c - 当指针未知时,如何释放 C 中的内存?

algorithm - 两行拟合间隔