在O(1)时间删除链表某一节点

本文介绍了一种在O(1)时间内删除单链表中指定节点的方法,包括四种特殊情况:链表为空、链表仅有一个节点、删除的是尾节点及删除非尾节点的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定单链表头节点和一个结点指针,在O(1)时间删除该结点。


struct ListNode
{
	int	m_nValue;
	ListNode* m_pNext;
};

void DeleteNode( ListNode** pListHead, ListNode* pToBeDeleted )
{
	//1.链表为空
	if ( NULL == *pListHead || NULL == pToBeDeleted )
		return;

	//2.链表只有一个结点						//O(1)
	if ( *pListHead == pToBeDeleted )
	{
		delete pToBeDeleted;
		pToBeDeleted = NULL;
		*pListHead = NULL;

		return;
	}

	//3.被删除结点为链表尾节点					//O(N)
	if ( NULL == pToBeDeleted->m_pNext )
	{
		ListNode* pPrev = *pListHead;

		while ( pToBeDeleted != pPrev->m_pNext )
			pPrev = pPrev->m_pNext;

		delete pToBeDeleted;
		pToBeDeleted = NULL;
		pPrev->m_pNext = NULL;

		return;
	}

	//4.被删除结点是至少有两个结点的链表非尾节点//O(1)
	ListNode* pNext = pToBeDeleted->m_pNext;

	pToBeDeleted->m_nValue = pNext->m_nValue;
	pToBeDeleted->m_pNext = pNext->m_pNext;

	delete pNext;
	pNext = NULL;
	return;
}




评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值