标签:链表
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);
并不是一定需要得到被删除的结点的前一个结点,可以将被删除结点的后一个结点的内容复制到被删除结点,然后将后一个结点删除。
void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted)
{
if (!pListHead || !pToBeDeleted)
return;
if (pToBeDeleted->m_pNext != NULL)
{
ListNode* pNext = pToBeDeleted->m_pNext;
pToBeDeleted->m_nValue = pNext->m_nValue;
pToBeDeleted->m_pNext = pNext->m_pNext;
delete pNext;
pNext = NULL;
}
//链表只有一个结点,删除头结点(也是尾结点)
else if(*pListHead == pToBeDeleted)
{
delete pToBeDeleted;
pToBeDeleted = NULL;
*pListHead = NULL;
}
//要删除的结点是尾结点
else
{
ListNode* pNode = *pListHead;
while (pNode->m_pNext != pToBeDeleted)
{
pNode = pNode->m_pNext;
}
pNode->m_pNext = NULL;
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}
上面的解法有一个假设:要删除的结点的确在链表中。需要O(n)的时间才能判断链表中是否包含某一结点,受到O(1)的限制,不得不把确保结点在链表中的责任推给了函数DeleteNode的调用者。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:链表
原文地址:http://blog.csdn.net/wangfengfan1/article/details/46793755