题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除节点。链表结点与函数的定义如下:
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);分析:要删除结点i,先把i的下一个节点j的内容复制给i,然后把i的指针指向结点j的下一个结点。此时再删除结点j,其效果相当于把结点i删除了。
上述思路有几个小问题:1.如果要删除的结点位于链表的尾部,那么就没有下一个节点,我们只能从头遍历链表并完成删除。2.如果链表中只有一个节点,而我们又要删除链表的头结点,此时我们在删除结点之后还要把链表的投结点置NULL。下面是实现代码:
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:
}
}本文出自 “仙路千叠惊尘梦” 博客,请务必保留此出处http://secondscript.blog.51cto.com/9370042/1582956
原文:http://secondscript.blog.51cto.com/9370042/1582956