题目描述🍗
只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点
思路分析🍗
结点不重要,,重要的是数据
不删自己,删除后面的结点:
1.把后面结点数据复制到当前
2.删除后一个结点
完整代码🍗
//只给定单链表中某个结点p(并非最后一个结点,即p->next != NULL)指针,删除该结点; (面试重点)
//删除成功返回true,失败返回false
bool DelNode(List plist, Node* pToDel)
{
if (pToDel == NULL)
return false;
Node* p;
//不是最后一个节点
if (pToDel->next != NULL)//删除pToDel后一个节点
{
p = pToDel->next;
pToDel->data = p->data;//把后一个节点的数据复制到pToDel,这样删除后一个就相当于删除pToDel
pToDel->next = p->next;
free(p);
return true;
}
//如果pToDel是最后一个节点,那么就必须找到它的前驱
for (p = plist; p->next != NULL && p->next != pToDel; p = p->next)
;
if (p->next == NULL)//没有pToDel
return false;
p->next = NULL;
free(pToDel);
return true;
}
int main()
{
Node head;
InitList(&head);
for (int i = 0; i < 10; i++)
{
Insert_tail(&head, i);
}
Show(&head);
Node* p1 = Search(&head, 0);//第0个节点
Node* p2 = Search(&head, 5);//第5个节点
Node* p3 = Search(&head, 9);//第9个节点
DelNode(&head, p1);
DelNode(&head, p2);
DelNode(&head, p3);
Show(&head);
return 0;
}
本篇完!🍗