算法思路:
链表中数据域为key 的节点可能是头结点,和中间尾节点。要分别进行讨论。
删除链表的头结点:
挪头指针,
将节点删除,
将原来指向删除节点的指针指向现在的头结点
删除链表的中间尾节点:
将要删除的链表节点从链表中移除
删掉要删除的节点
将原来指向删除节点的指针指向新位置
注意:
使用两指针联动进行遍历链表
ElemSN* deleteKeyNode(ElemSN *h, int key)
{
ElemSN *p = NULL, *q = NULL,*pdel=NULL;
for (p = h; p; )
{
if (p->data == key)//如果p的数据域为key
{
if (p == h)//如果p所指向的是表头
{
h = h->next;//将表头指针后移
free(p);
p = h;
}
else//p所指向的节点为中间节点或者尾节点
{
q->next = p->next;//将要删除的节点从链表中移除
free(p);
p = q->next;
}
}
else
{
q = p;
p = p->next;
}
}
return h;
}