标签:
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1),时间删除该节点。链表节点与函数的定义如下:
struct ListNode{
int m_nValue; ListNode* m_pNext;
}
void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);
解析:既然已经给定了要删除节点的指针,可以将删除节点的下一个节点的内容复制到要删除的节点,覆盖原有的内容,并将要删除节点的指针指向下一个节点的下一个节点,再将下一个节点删除。这期间要考虑两种特殊的情况:1、要删除的节点是最后一个节点,需要遍历链表找到删除节点的前序节点,并完成删除操作;2、如果当前链表中只有一个节点,要将链表的头结点置NULL。
1 struct ListNode{ 2 int m_nValue; 3 ListNode* m_pNext; 4 }; 5 6 void DeleteNode(ListNode** pListNode,ListNode* pToBeDeleted){ 7 if(!pListNode||!pToBeDeleted) 8 return ; 9 //正常情况 10 if(pToBeDeleted->m_pNext!=NULL){ 11 pToBeDeleted->m_nValue = pToBeDeleted->m_pNext->m_nValue; 12 pToBeDeleted->m_pNext = pToBeDeleted->m_pNext->m_pNext; 13 delete pToBeDeleted->m_pNext; 14 pToBeDeleted->m_pNext = NULL; 15 } 16 //链表中只有一个节点 17 else if(*pListNode == pToBeDeleted){ 18 delete pToBeDeleted; 19 pToBeDeleted = NULL; 20 *pListNode = NULL; 21 } 22 //链表中有多个节点,删除尾节点 23 else{ 24 ListNode *pNode = *pListNode; 25 while(pNode->m_pNext!=pToBeDeleted){ 26 pNode = pNode->m_pNext; 27 } 28 pNode->m_pNext = NULL; 29 delete pToBeDeleted; 30 pToBeDeleted = NULL; 31 } 32 }
标签:
原文地址:http://www.cnblogs.com/yangrenzhi/p/5780138.html