面试题13:
题目:给定单项链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
//链表结点
struct ListNode
{
int m_nvalue;
ListNode* m_pNext;
};
//创建链表
ListNode* CreateListNode(int value)
{
ListNode *pNode = new ListNode();
pNode->m_nvalue = value;
pNode->m_pNext = NULL;
return pNode;
}
//连接链表的两个结点
void ConnectListNode(ListNode* pCurrent,ListNode* pNext)
{
if(pCurrent == NULL)
{
cout<<"前一个节点为空:"<<endl;
exit(1);
}
else
{
pCurrent->m_pNext = pNext;
}
}
//打印链表信息
void PrintList(ListNode* pHead)
{
ListNode *pNode = pHead;
while(pNode != NULL)
{
cout<<pNode->m_nvalue <<"->";
pNode = pNode->m_pNext ;
}
cout<<"nul"<<endl;
}
//删除链表结点
void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted)
{
if(!pListHead ||!pToBeDeleted)
return ;
//要删除的结点后面还有结点
if(pToBeDeleted->m_pNext != NULL)
{
ListNode *pNext = pToBeDeleted->m_pNext ;
//将pNext的内容复制到 pToBeDeleted,再将 pToBeDeleted的指针指向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;
}
}
int main()
{
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5);
ListNode* pNode6 = CreateListNode(6);
ListNode* pNode7 = CreateListNode(7);
ConnectListNode(pNode1,pNode2);
ConnectListNode(pNode2,pNode3);
ConnectListNode(pNode3,pNode4);
ConnectListNode(pNode4,pNode5);
ConnectListNode(pNode5,pNode6);
ConnectListNode(pNode6,pNode7);
PrintList(pNode1);
DeleteNode(&pNode1,pNode3);
PrintList(pNode1);
}
“`