给你一个时间复杂度为o(1)的方案,还没调试,大概思路是这样的typedef int ElementType;
struct ListNode
{
struct ListNode *m_pNext;
ElementType m_Data;
};
void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted)
{
assert(pListHead != NULL && pToBeDeleted != NULL);
if (pToBeDeleted->m_pNext != NULL) //说明还有后继结点
{
ListNode *pTmp = pToBeDeleted->m_pNext;
//直接把后一个结点赋值给要删除的结点
pToBeDeleted->m_Data = pTmp->m_Data;
pToBeDeleted->m_pNext = pTmp->m_pNext;
//然后删除下一个结点
free(pTmp);
}
else if (pListHead != pToBeDeleted) //如果没有后继结点,而且不是头结点
{
ListNode *pTmp = pListHead;
while (pTmp != NULL)
{
//找到要删除结点的前一个
if (pTmp->m_pNext = pToBeDeleted)
{
//删除pToBeDeleted结点
pTmp->m_pNext = pToBeDeleted->m_pNext;
free(pToBeDeleted);
break;
}
}
}
else //说明程序只有头结点,删除的也是头结点
{
free(pToBeDeleted);
pListHead = NULL; //这里这个形参被办法返回,所以这个函数的参数定义的有点问题
}
}
|