C语言,已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此 结点,然后删除。
时间: 2024-05-04 20:15:56 浏览: 118
好的,请稍等,我来思考一下。假设您的单向链表数据结构如下:
```c
typedef struct ListNode{
int val;
struct ListNode *next;
}ListNode;
```
删除链表中某个结点的步骤通常分为两部分:
1. 找到要删除的结点的前一个结点(称为 prev)
2. 通过 prev->next 将要删除的结点从链表中删除
基于这个思路,我们可以先遍历整个链表,同时记录遍历到的结点及其前一个结点,当遍历的结点等于要删除的结点时,通过 prev->next = curr->next 将其从链表中删除。
代码如下:
```c
ListNode *deleteNode(ListNode *head, int val) {
if(head->val == val){
ListNode *p = head;
head = head->next;
free(p);
return head;
}
ListNode *prev = head;
ListNode *curr = head->next;
while(curr != NULL){
if(curr->val == val){
prev->next = curr->next;
free(curr);
break;
}
prev = prev->next;
curr = curr->next;
}
return head;
}
```
以上代码是删除单向链表中某个节点的算法,它首先判断要删除的结点是否为头结点,是头结点时直接将 next 赋值给 head,然后释放原头结点。对于非头结点,遍历链表找到删除目标的结点并将其前一个结点的 next 指针指向其后一个结点,最后释放待删除结点的内存即可。
阅读全文