对给定的单链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结
时间: 2023-10-30 14:08:51 浏览: 140
由各子序列的中值元素组成非递减序列M;-高级算法设计
点。
算法思路:
1. 遍历链表,找到值为 x 的结点 p。
2. 如果 p 是链表的第一个结点,则不存在直接前驱结点,直接返回。
3. 如果 p 不是链表的第一个结点,则需要找到 p 的直接前驱结点 q。
4. 删除 q 的后继结点,即删除 p 的直接前驱结点。
算法实现:
```
void deletePredecessor(Node *head, int x) {
Node *p = head->next;
Node *q = head;
while (p != NULL && p->data != x) {
q = p;
p = p->next;
}
if (p == NULL) {
return; // 没有找到值为 x 的结点
}
if (p == head->next) {
return; // p 是链表的第一个结点,不存在直接前驱结点
}
q->next = p->next; // 删除 p 的直接前驱结点
free(p);
}
```
算法分析:
时间复杂度为 O(n),其中 n 是链表的长度。空间复杂度为 O(1)。
阅读全文