数据结构链表删除结点这个j>i-1能换成i<1吗

数据结构链表删除结点这个j>i-1能换成i<1吗?感觉if语句里面的另一个条件!(p-next)这个条件处理那i>n的情况,有点不太清楚能否直接去把if里面的那个条件换成i<1

img

可以把条件换成 i ,但是代码里需要有 i 自增或自减的操作,供参考:

Status ListDelete(LinkList& L, int i)
{
    ListNode* p = L, * q = NULL;
    if (i < 1 || !L || !L->next)
        return  ERROR;
    while (p->next && --i)  p = p->next;
    if (!p->next)
        return  ERROR;
    q = p->next;
    p->next = q->next;
    delete q;
    return OK;
}

【以下回答由 GPT 生成】

将删除结点的条件从j>i-1修改为i<1是可行的,并且不会影响链表的正确性。

在算法2.10中,步骤1进行了判断,如果i小于等于0或大于链表的长度n,则返回错误。如果将删除结点的条件修改为i<1,也就是i小于等于0,那么就会直接返回错误,与原来的判断逻辑保持一致。

当i小于等于0时,代表着删除第0个元素或删除第负数个元素,这是不合法的操作,因为链表的索引是从1开始的,所以将此类情况判断为错误是合理的。

另外,当i为正数时,算法2.10中的步骤2将指针p移动到第i-1个结点,也就是p指向要删除结点的前一个结点。步骤3判断p的下一个结点是否为空,如果为空则返回错误,这是为了处理i大于链表长度n的情况。所以算法中已经考虑了i>n的情况,不需要额外的判断条件。

综上所述,将删除结点的条件修改为i<1是可行的,且不会影响链表的正确性。

以下是修改后的算法2.10的C代码示例:

Status deleteElem(LinkList L, int i) {
    if (i < 1) {
        return ERROR;
    }
    LNode *p = L;
    int j = 0;
    while (p && j < i - 1) {
        p = p->next;
        j++;
    }
    if (!p || !p->next) {
        return ERROR;
    }
    LNode *q = p->next;
    p->next = q->next;
    free(q);
    return OK;
}

其中,LinkList是指向头结点的指针,LNode是链表的结点类型,Status是函数返回的状态类型,OK表示成功,ERROR表示错误。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^