int delx1(LinkList &L, ElemType x) {
LinkList prepre = L, pre = prepre->next, p;
if(pre->data == x) return 0;
while(p && p->data!=x) {
prepre = pre;
pre = p;
p = p->next;
}
if(p) {
prepre ->next = p;
free(pre);
return 1;
}else return 0;
}
以下是对这段代码的分析:
一、功能描述
该函数`delx1`的作用是在给定的单链表`L`中,删除第一个值为`x`的节点的前驱节点。前提是链表中至少含有两个数据节点。
二、代码解释
1. LinkList prepre = L, pre = prepre->next, p;
这里定义了三个指针变量。prepre初始指向链表的头节点L,pre初始指向头节点的下一个节点,p暂时未指向任何节点。
2. if(pre->data == x) return 0;
检查如果链表的第二个节点的值就等于x,那么由于没有前驱节点的前驱节点,所以无法删除,直接返回 0,表示删除操作失败。
3. while(p && p->data!=x) { prepre = pre; pre = p; p = p->next; }`:
这是一个循环,目的是在链表中查找值为x的节点。只要p不为NULL且p所指向节点的数据不等于x,就继续循环。在循环过程中,prepre始终指向pre的前驱节点,pre指向当前正在检查的节点,p指向pre的下一个节点。
4. if(p) { prepre->next = p; free(pre); return 1; } else return 0;
如果p不为NULL,说明找到了值为x的节点,此时删除pre所指向的节点(即值为x的节点的前驱节点)。将prepre的next指针指向p,然后释放pre所指向的内存空间,最后返回 1,表示删除操作成功。 如果p为NULL,说明遍历完链表也没有找到值为x的节点,返回 0,表示删除操作失败。
三、时间复杂度
假设链表的长度为n,在最坏的情况下,需要遍历整个链表才能确定是否存在值为x的节点,所以时间复杂度为O(n)。
四、空间复杂度
该算法只使用了几个额外的指针变量,不随输入规模的增加而增加额外的空间,所以空间复杂度为O(1)。