剑指Offer :面试题13 在O(1)时间删除链表节点

/*
在O(1)时间删除链表节点:
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该节点。链表结点与函数的定义如下:


关键:
找到该节点{如果该节点后面还有节点,将其值与其后面的节点交换,然后删除该节点本身
          {如果该节点后面没有节点,需要找到其前面的节点,将其前面节点的指向节点指针置空
如果该节点为头节点,那么另其头节点为其后面节点的指针
如果只有一个节点,删除的是头尾节点,需要把链表的头节点置为空
*/


/*
关键:
1 if(pDelNode->_next != NULL)//考虑删除的节点不是尾节点,只需要看待删除节点的指向是否为空即可
2 else if(pDelNode == *pHead)//考虑链表只有一个节点,即头节点指针和待删除节点指针相同即可
{
delete pDelNode;//直接删除即可
pDelNode = *pHead = NULL;
}
3else//考虑有多个节点,但删除的节点是尾节点的情形
delete pDelNode;
pDelNode = NULL;//一定要注意,是删除的指针置空,否则变成野指针
4 必须确保要删除的节点在链表中
*/
#include <stdio.h>


typedef struct Node
{
int _iVal;
struct Node* _next;
}Node;


void delNod(Node** pHead,Node* pDelNode)//pHead是指向链表指针的指针,是二级指针
{
if(!pHead || !pDelNode)//鲁棒性
{
return ;
}
if(pDelNode->_next != NULL)//考虑删除的节点不是尾节点,只需要看待删除节点的指向是否为空即可
{
Node* pNextNode = pDelNode->_next;
pDelNode->_iVal = pNextNode->_iVal;//重新设置值
pDelNode->_next = pNextNode->_next;
delete pNextNode;
pNextNode = NULL;
}
else if(pDelNode == *pHead)//考虑链表只有一个节点,即头节点指针和待删除节点指针相同即可
{
delete pDelNode;//直接删除即可
pDelNode = *pHead = NULL;
}
else//考虑有多个节点,但删除的节点是尾节点的情形
{
Node* pNode = *pHead;
while(pNode->_next != pDelNode)
{
pNode = pNode->_next;
}
pNode->_next = NULL;
delete pDelNode;
pDelNode = NULL;//一定要注意,是删除的指针置空,否则变成野指针
}
}


int main(int argc,char* argv[])
{


}


 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值