
题目描述🍗
只给定单链表中某个结点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; 
}

本篇完!🍗



















