单链表中如何快速删除p指向的节点?( 简单方法:复杂度为O(1) )

问题:
只知道指针P指向一个单向非循环链表的节点,不是头节点也不是尾节点,从链表上把 P指向的节点删除…

思路:

一般的思路是要遍历链表找到节点P的前驱节点, 然后再删掉节点P, 但是这样效率不是很高, 可以换个思路, P节点的后继节点是可以在O(1) 复杂度下得到的, 可以将P的后继节点的数据复制到P节点中, 然后删掉P的后继节点, 重新接链即可…

实现如下:

temp = p->next;

p->data = p->next->data;

p->next = p->next->next;

delete temp;

或者:

temp=p->next;

p->data=temp->data;

p->next=temp->next;

delete temp;

这样就通过复制后面一个节点元素的值和next,然后删除后一个节点的方法,把当前p指向的节点间接地快速删除了

参考的原文连接:

http://blog.csdn.net/cnnumen/article/details/5804438

附加:要在链表中插入节点时,思路很简单,只需要考虑两个问题
1.要插入的节点的next值是什么?
2.要插入的节点的前一个节点是谁?也就是,把哪个节点的next值设置为指向当前待插入节点的指针?
考虑好这两个问题,就能把要插入的节点链接到原来的链表中去了。要注意,一般是先要考虑,先处理待插入节点的next值,否则,可能就会导致它的next值对应的节点的指针找不到了。也就是考虑和处理顺序是先后再前。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值