码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-07 21:17:01      阅读:119      评论:0      收藏: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的调用者。


版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:链表

原文地址:http://blog.csdn.net/wangfengfan1/article/details/46793755

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!