您的位置:首页 > 其它

微软100题(60)在O(1)时间内删除链表结点

2015-06-02 21:54 399 查看
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);

思路:删除链表中某个结点,要知道这个结点前面的结点,但是现在要求O(1)时间删除,只知道后面结点的信息,如果把后面结点复制到要删除的结点,删除后面的那个结点就间接实现了 删除指定结点,但是有一种特殊情况,当要删除的结点是最后一个结点时候,则要老老实实从前往后找到最后一个结点的前一个结点
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted)
{
	if(pListHead==NULL || pToBeDeleted==NULL) 
		return;
	if(pListHead==pToBeDeleted && pToBeDeleted->m_pnext==NULL)//只有一个结点,且删除的是头结点
	{
		delete pToBeDeleted;
		pToBeDeleted = NULL;
		pListHead = NULL;
	}
	else if(pToBeDeleted->m_pnext!=NULL)//不是尾结点
	{
		ListNode* pnext = pToBeDeleted->m_pnext;
		pToBeDeleted->m_value = pnext->m_value;
		pToBeDeleted->m_pnext = pnext->m_pnext;
		delete pnext;
		pnext = NULL;
	}
	else
	{
		ListNode* pnode = pListHead;
		while (pnode->m_pnext!=pToBeDeleted)
		{
			pnode = pnode->m_pnext;
		}
		pnode->m_pnext = NULL;
		delete pToBeDeleted;
		pToBeDeleted = NULL;
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: