实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针。

例子:

输入:指向链表a->b->c->d->e中结点c的指针

结果:不需要返回什么,得到一个新链表:a->b->d->e

解答

这个问题的关键是你只有一个指向要删除结点的指针,如果直接删除它,这条链表就断了。 但你又没办法得到该结点之前结点的指针,是的,它连头结点也不提供。在这种情况下, 你只能另觅他径。重新审视一下这个问题,我们只能获得从c结点开始后的指针, 如果让你删除c结点后的某个结点,那肯定是没问题的。比如删除结点d,那只需要把c 的next指针指向e,然后delete d就ok了。好的,如果我们就删除结点d,我们将得到 a->b->c->e,和目标链表只差了一个结点。怎么办呢?把d的数据给c! 结点结构都是一样的,删除谁都一样,最关键的是结点中的数据,只要我们留下的是数据 a->b->d->e就OK了。

思路已经有了,直接写代码?等等,写代码之前,让我们再简单分析一 下可能出现的各种情况(当然包括边界情况)。如果c指向链表的:1.头结点;2.中间结点。 3.尾结点。4.为空。情况1,2属于正常情况,直接将d的数据给c,c的next指针指向d 的next指向所指结点,删除d就OK。情况4为空,直接返回。情况3比较特殊,如果c 指向尾结点,一般会认为直接删除c就ok了,反正c后面也没有结点了,不用担心链表断开。 可是真的是这样吗?代码告诉我们,直接删除c,指向c的那个结点(比如说b)的next指针 并不会为空。也就是说,如果你打印这个链表,它还是会打印出和原来链表长度一样的链表, 而且最后一个元素为0!

关于这一点,原书CTCI中是这么讲的,这正是面试官希望你指出来的。然后, 你可以做一些特殊处理,比如当c是尾结点时,将它的数据设置为一些特殊字符, 这样在打印时就可以不打印它。当然也可以直接不处理这种情况,原书里的代码就是这么做 的。这里,也直接不处理这种情况。

bool remove(node *c){if(c==NULL || c->next==NULL) return false;// if(c->next==NULL){//c为最后一个元素时直接删除,不行,最后还是会打印出一个为0的结点,需要特殊处理//     delete c;//     return;// }node *q = c->next;c->data = q->data;c->next = q->next;delete q;return true;
}

cc150:实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针相关推荐

  1. 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点

    /*实验2 1. 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点 (low和high的值是多少可自由设计).并且要在程序中验证其功能实现. (可在实验1的第3题的基 ...

  2. 设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的)

    设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的). #include <stdio.h> #include<malloc.h> typedef str ...

  3. 用一个单链表L实现一个队列(算法导论第十章10.2-3)

    用一个单链表L实现一个队列(算法导论第十章10.2-3) template<typename T> class HalfNode {public:T key;HalfNode* next; ...

  4. 用一个单链表L实现一个栈(算法导论第十章10.2-2题)

    用一个单链表L实现一个栈(算法导论第十章10.2-2题) template<typename T> class HalfNode {public:T key;HalfNode* next; ...

  5. 数据结构例16.试设计一个算法, 使得在一个有序的单链表中插入一个元素后仍然有序。

    /* 16.试设计一个算法, 使得在一个有序的单链表中插入一个元素后仍然有序. */ # include <iostream> # include <stdlib.h> # i ...

  6. 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。

    今天和大家分享一道2009年代码为408的一道真题: 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链 ...

  7. 单链表-删除单链表L中奇数号节点(双指针法)

    题意: 有一个带头节点的单链表L,设计一个算法,删除其中第1,3,5,7号-节点,即删除奇数号的节点. 单链表的存储结构: typedef struct LinkList{int data;LinkL ...

  8. 删除链表的中间节点 Java实现_【链表问题】删除单链表的中间节点

    前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢. [题目描述] 给定链表的头节点head ...

  9. 删除单链表中倒是第K个结点

    [问题描述] 设有头结点单链表,删除单链表中倒数第k个结点. [输入形式] 第一行输入若干个整数建立带头结点的单链表(以输入字符作为结束). 第二行输入一个整数k,表示删除倒数第k个结点. [输出形式 ...

最新文章

  1. 如何利用遗传算法进行自变量降维
  2. 放大器和比较器的区别
  3. git 如何清理操作日志_git如何清空所有的commit记录
  4. java 桥接模式_JAVA设计模式之【桥接模式】
  5. string和byte[]的相互转换
  6. JavaScript基本类型和引用类型
  7. kafka partition分配_logstash消费kafka数据,partition分配不均衡
  8. CKEditor 富文本编辑器转PDF
  9. 机器学习--详解基于梯度下降的Logistic回归算法原理
  10. solidworks_adams_simuilink联合仿真简易教程
  11. Python自动发送微信消息
  12. 关于虚拟机中对象访问定位的两种方式的一些思考
  13. Unity性能优化 :合批篇
  14. MySQL数据库报错汇总(持续更新中)
  15. PS 选区的基础使用
  16. 《编程珠玑》读书笔记 part1
  17. 解决关于电脑跳出一些垃圾弹窗的问题
  18. 2022年全球市场数字电位器IC总体规模、主要生产商、主要地区、产品和应用细分研究报告
  19. 真实入手评测:荣耀手表gspro和华为gt2的区别-荣耀手表gspro和magic2的区别-看看内行人怎么说
  20. 每天学习写论文——Day30 英文论文就比中文高大上吗?

热门文章

  1. 什么是 高内聚 低耦合??
  2. Rock Pi X刷Ubuntu系统
  3. Matlab 1.3编程
  4. 控制图(control chart)以及评估指标(ARL、ATS)
  5. 常见Web源码泄漏及其利用
  6. 计算机毕业设计jsp小福星宠物领养管理系统
  7. Linux忘记root密码如何找回
  8. php mcrypt generic,php – mcrypt_generic vs mcrypt_encrypt
  9. Linux配置nginx缓存(expires)功能
  10. raspberry pi (10) 触摸开关传感器,超声波传感器,红外避障传感器