关于单链表,用户输入一个数在链表中查找并进行删除

这一段是别人发的,但是我不太理解每一行的意思,有没有人帮帮我?

//删除算法(对用户输入的数进行删除)
Linklist *Delete_link1(Linklist *head,int key)
{
Linklist *p1,*p2;
if(head->data==key)
{
p2=head;
head=head->next;
free(p2);
}
p1=head;
p2=head->next;
while(p2!=NULL)
{
if(p2->data==key)
{
p1->next=p2->next;
free(p2);
p2=p1->next;
}
else
{
p1=p2;
p2=p2->next;
}
}
return head;
}

img

其实就是一个链表的遍历,因为链表结点的连接需要知道他的上一个结点位置和下一个结点位置,所以用两个移动节点进行遍历,当找到要删除的结点,直接越过这个结点进行连接,让然后释放这个结点的内存,就删除了

第一个if是判断如果要删除的数据在链表第一个位置,让p2等于第一个结点,原来的结点变为第二个,删除p2,这样就把第一个元素删了。
如果第一个结点不需要删除,那就让p1等于第一个结点,p2等于p1后面的结点,这两个指针一起遍历,如果p2找到了被删除的元素,释放p2,把p1后面的链连到p2后面,我建议去掉while循环下第一个if里的 p2=p1->nxet;