题目:给定单向链表的头指针和一个节点指针,定义一个函数在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