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

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。

思路:题目要求的时间复杂度,迫使我们不得不,开拓思维,另辟蹊径。

代码:

#include<iostream>
using namespace std;
typedef struct ListNode
{
int value;
ListNode* next;
} lnode,*plnode;
plnode head;
plnode todel;
void delNode(plnode head,plnode todel)
{
if(!head||!todel) return;
if(todel->next!=NULL)
{
plnode pNext=todel->next;
todel->value=pNext->value;
todel->next=pNext->next;

delete pNext;
pNext=NULL;
}
else if(head==todel)
{
delete todel;
todel=NULL;
head=NULL;
}
else
{
plnode pNode=head;
while(pNode->next!=todel) pNode=pNode->next;
pNode->next=NULL;
delete todel;
todel=NULL;
}
}
void prtNode(plnode head)
{
plnode node=head;
while(node!=NULL)
{
cout<<node->value<<" ";
node=node->next;
}
cout<<endl;
}
void crelist()
{
head=new lnode;
head->value=0;
head->next=NULL;
int i;
plnode p;
plnode q=head;
for(i=1;i<5;i++)
{
p=new lnode;
p->value=i;
q->next=p;
p->next=NULL;
q=p;
}
todel=p;
}
int main()
{
crelist();
cout<<"before delete"<<endl;
prtNode(head);
delNode(head,todel);
cout<<"after delete"<<endl;
prtNode(head);
return 0;
}

reference:剑指Offer(何海涛著)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值