在O(1)时间内删除链表指定结点

链表节点结构如下,

struct ListNode

{
    int m_nKey;
    ListNode* m_pNext;
};
求出在O(1)时间内删除链表给定结点的算法函数,该函数的声明如下:

void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted);

struct ListNode 

{ 

	int m_nKey; 

	ListNode* m_pNext; 

‬}; 

//在O(1)时间内删除链表结点 

‬void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted) 

‬{ 

	if (NULL != pToBeDeleted->m_pNext) //如果删除的节点不是尾节点

	{ 

		ListNode *pRealDeleted = pToBeDeleted->m_pNext; 

		pToBeDeleted->m_nKey = pRealDeleted->m_nKey; 
		//将待删除的节点的下一个节点的内容复制到要删除的节点

		pToBeDeleted->m_pNext = pRealDeleted->m_pNext; 
		//将要删除的节点的指针指向下一个节点的下一个节点

		delete pRealDeleted; 
		//删除要删除的节点的下一个节点,该节点的内容被保存待要删除的节点

	} 

	else //如果删除的节点是尾节点

	{ 

		ListNode *pNode = pListHead; 

		while (NULL != pNode) //非空链表

		{ 

			if (pNode->m_pNext == pToBeDeleted) //找到了尾节点的前一个节点

			{ 

				pNode->m_pNext = NULL; 

				delete pToBeDeleted; 

				break; 

			} 
			pNode = pNode->m_pNext; //正向遍历链表

		} 

	} 

} 




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值