链表-删除链表的节点

博客围绕剑指offer中在最少时间内删除链表节点的题目展开。分析了链表删除需考虑的情况,如空链表、待删节点为空等,还针对待删节点在链表中的不同位置进行讨论。给出了具体思路,最后分析复杂度,平均复杂度为O(1)。

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

剑指offer的一个题,题目是要求在最少的时间内删除链表的节点。

问题分析:对于链表的删除,按照剑指offer的一贯思路就是展开讨论:1、空链表咋办、待删除的节点是空节点咋办;2、要删除的节点在链表中的位置有三种情况:1、链表只有一个节点,待删除节点是表头又是尾节点;2、链表有多个节点,待删除的节点是尾节点;3、要删除的节点不是尾节点。

我们的思路是:读入待删除节点的下一个节点的信息,用待删除节点的下一个节点信息复制到待删除节点,然后删除待删除节点的下一个节点。

复杂度分析:对于n-1个非尾节点,可以在O(1)时间内搞定,对于尾节点,需要顺序查找,时间复杂度为O(n),所以总的平均复杂度为[(n-1)xO(1)+O(n)]/n=O(1)。

struct ListNode{
	int  m_value;
	ListNode* m_next;
};

void DeletNode(ListNode** pListHead, ListNode* pToBeDeletd)

void DeletNode(ListNode** pListHead, ListNode* pToBeDeletd){
	if(!pListHead || !pToBeDeletd){
		return;
	}
	
	//要删除的节点不是尾节点
	if(pToBeDeletd -> m_next!= nullptr){
		ListNode* pNext = pToBeDeletd -> m_next; //保存要删除的节点的下一个节点
		pToBeDeletd -> m_value = pNext -> m_value; //将要删除节点的下一个节点的值和指针覆盖掉要删除的节点
		pToBeDeletd -> m_next = pNext -> m_next;
	}
	
	delete pNext;
	pNext = nullptr;//删除要删除节点的下一个节点,并将其指针指向nullptr
	
	//链表只有一个节点,删除头节点也是尾节点
	else if(*pListHead == pToBeDeletd){
		delete pToBeDeletd;
		pToBeDeletd = nullptr;
		*pListHead = nullptr;
	}
	//链表中有多个节点,删除尾节点
	else{
		ListNode* pNode = *pListHead;
		while(pNode-> m_next != pToBeDeletd){
			pNode = pNode->m_next;
		}
		
		pNode->m_next = nullptr;
		delete pToBeDeletd;
		pToBeDeletd = nullptr;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值