关闭

在O(1)时间删除链表结点

标签: 链表
720人阅读 评论(0) 收藏 举报
分类:

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的调用者。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:156449次
    • 积分:6150
    • 等级:
    • 排名:第4029名
    • 原创:479篇
    • 转载:2篇
    • 译文:1篇
    • 评论:3条
    最新评论