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