【10】剑指offer-面试题13(O(1)时间删除节点)

【1】题目

【2】思路

删除的链表节点有四种情况:

(1)空链表,返回无;

(2)一个节点,头尾一样,删除节点,头尾清零;

(3)尾部节点,需要遍历链表,找到前一个节点,然后删除后一个节点。

(4)中间任意位置节点,找到待删除节点的下一个节点,用下一个节点覆盖当前节点,然后删除后一个节点即可。

【3】代码

#include <stdio.h>
#include <iostream>
#include<vector>
#include<time.h>
#include<cstring>

using namespace std;

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


//删除指定位置的节点  *plistHead是指向头节点的指针
void DeleteNode(ListNode* * plistHead, ListNode *pToDeleted)
{
	//指针为空
	if (!plistHead|| !pToDeleted)
	{
		return;
	}
	//[1]待删除的节点不是最后一个节点
	if (pToDeleted->m_pNext!=NULL)
	{
		ListNode *p_next = pToDeleted->m_pNext;
		pToDeleted->m_nValue = p_next->m_nValue;
		pToDeleted->m_pNext = p_next->m_pNext;
		delete p_next;
		p_next = NULL;
	}
	//[2]删除的节点即使头结点也是尾节点
	else if (pToDeleted->m_pNext == NULL)
	{
		delete pToDeleted;
		pToDeleted = NULL;
		*plistHead = NULL;
	}
	//[3]待删除的节点是最后一个节点
	else if (pToDeleted->m_pNext == NULL)
	{
		delete pToDeleted;
		pToDeleted = NULL;
		*plistHead = NULL;
	}
	//[4]删除的节点是最后一个尾节点,需要找到前一个节点
	else 
	{
		//寻找被删除节点的上一个节点
		ListNode *head = *plistHead;
		while (head->m_pNext!= pToDeleted)
		{
			head = head->m_pNext;
		}
		head->m_nValue = pToDeleted->m_nValue;
		head->m_pNext = NULL;
		delete pToDeleted;
		pToDeleted= NULL;
	}

}





 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值