对给定的单链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结点的c语言代码
时间: 2023-04-03 20:03:01 浏览: 144
以下是删除 L 中值为 x 的结点的直接前驱结点的 C 语言代码:
```c
struct ListNode* deletePredecessor(struct ListNode* head, int x) {
struct ListNode* curr = head;
struct ListNode* prev = NULL;
while (curr != NULL) {
if (curr->next != NULL && curr->next->val == x) {
if (prev == NULL) {
head = curr->next;
} else {
prev->next = curr->next;
}
free(curr);
break;
}
prev = curr;
curr = curr->next;
}
return head;
}
```
相关问题
对给定的单链表 l ,设计一个算法,删除 l 中值为 x 的结点的直接前驱结点。
这里给出一个算法来删除单链表l中值为x的结点的直接前驱结点。
1. 首先判断l是否为空或只有一个结点,如果是,则不存在直接前驱结点,直接返回。
2. 遍历单链表l,同时记录当前结点和当前结点的下一个结点。
3. 判断当前结点的下一个结点是否为空。如果为空,则当前结点为链表的最后一个结点,不存在直接前驱结点,直接返回。
4. 判断下一个结点的值是否为x。如果是,则将当前结点的next指针指向下下个结点,即删除了直接前驱结点。
5. 如果下一个结点的值不是x,则继续向后遍历。
这个算法的时间复杂度是O(n),其中n是链表l的长度。
以下是算法的Python代码实现:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def delete_predecessor(l, x):
if l is None or l.next is None:
return l
dummy = ListNode(0)
dummy.next = l
curr = dummy
while curr.next is not None:
if curr.next.val == x:
curr.next = curr.next.next
else:
curr = curr.next
return dummy.next
```
使用这个算法可以删除给定单链表l中值为x的结点的直接前驱结点。
对给定的单链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结点。C语言
struct ListNode {
int val;
struct ListNode *next;
};
void deletePreNode(struct ListNode *head, int x) {
struct ListNode *p = head;
while (p->next != NULL) {
if (p->next->val == x) {
struct ListNode *pre = p->next;
p->next = pre->next;
free(pre);
return;
}
p = p->next;
}
}
相关推荐















