面试题:如何删除单链表某节点
来源:互联网 发布:网络摄像机品牌排行榜 编辑:程序博客网 时间:2024/05/22 07:45
想起之前面试,有个面试官给出了一个单链表的head头指针,以及要删除的p节点,让我说出要如何删除该p节点。
我爽快的说,只需要获取到p节点的前驱结点p->pre, p->pre->next = p->next. free(p),考官说,是单链表,不是双链表、
我又迅速地说,那就借助head指针,一直找,找到p节点,并保留p的前一个指针不就可以了。
考官说,要是这个链表数据很多,这样做,会有点慢,让我再想想,相当于提供了一个不知道头结点的单链表。
后来网路上看到别人说有一种叫狸猫换太子的算法,可以巧妙地删除某一个链表的节点(非尾节点)。
架设有个一链表 head - > A -> B -> C -> D -> E -> F -> G -> NULL,要删除 C 节点,指向 C 节点的指针叫 pDelet,
思路:用 C 节点的下一个 节点 D 来作为要删除的节点。将 D 节点的 data 传给 C 节点的 data ,再将 C 的 next 指针指向 D 的next 节点,释放 D 节点。
即: pDelet->data = pDelet->next->data;
pDelet->next = pDelet->nexxt->next;
free(pDelet);
算法如下:
woid DeletOneNode(node *p)
{
Assert(p != NULL);
node * pNext = p->next;
if(pNext != NULL){ //判断要删除的节点是不是最后一个节点
p->data = pNext->data;
p ->next = pNext->next;
free(pNext);
}else{ //p是尾节点
printf("This is the Rear node,you can't delete it");
}
}
但是,一般涉及到要经常删除和添加节点的链表,一般都是采用双链表。
思考:如何保证p->data 没有内存泄露问题, pNext-.>data 不会重复释放?
- 面试题:如何删除单链表某节点
- 【面试题】删除链表中倒数第n个节点
- 面试题2 编程实现单链表删除节点
- 面试题11 :O(1)删除单链表节点
- 《剑指Offer》面试题57:删除链表中重复的节点
- 面试题57:删除链表中的重复节点
- 几道链表操作的经典面试题:链表有环、删除节点
- 【剑指offer】面试题18:删除链表中重复的节点
- 微软,Google面试题 (32) —— O(1)时间删除节点
- 剑指offer面试题13在O(1)时间复杂度内删除单链表的一个节点
- 基于visual Studio2013解决面试题之0604O(1)时间复杂度删除链表节点
- 剑指offer 面试题12 在O(1)时间删除链表节点
- 剑指Offer :面试题13 在O(1)时间删除链表节点
- 面试题13:在O(1)时间删除链表节点
- 剑指offer 面试题13—在O(1)时间删除链表节点
- 【面试题】在O(1)时间复杂度删除链表节点
- 剑指Offer面试题13(java版):在O(1)时间删除链表节点
- 剑指offer面试题13-在O(1)时间删除链表的节点
- php学习一(基础语法)
- memcached内存管理
- 编程修养(四)
- Silverlight 中 OnApplyTemplate方法没有执行
- [ACM] hdu 1232 畅通工程(并查集)
- 面试题:如何删除单链表某节点
- 编程修养(五)
- 数据库拆分
- 重新测量ListView,GridView的高度
- C实现音乐播放器
- 软件测试面试题集合(转)
- WEB架构师成长之路之一-走正确的路
- 编程修养(六)
- 数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示