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

样例:

输入:指向链表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. 009实现一个算法来删除单链表中的一个结点,仅仅给出指向那个结点的指针(keep it up)

    呵呵,这个题不能直接删除已知的结点.由于是单链表,不知道前驱,仅仅知道 后继结点,直接删除会使链表断开.只是我们能够删除已知结点的后继结点, 把后继结点的值赋值给已知结点. #include < ...

  2. 删除单链表节点,时间复杂度为O(1)

    一个编程练习,删除单链表一个节点,且时间复杂度控制在O(1)内. 1.核心操作代码如下: struct ListNode { int m_data; ListNode *m_pNext; }; voi ...

  3. leetCode题解之删除单链表中指定的元素

    1.问题描述 Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> ...

  4. PHP之从反向删除单链表元素的问题谈起

    在完成一个单链表的删除指定元素的题目中,我发现了一件神奇的事情,php对象赋值给另外一个变量后,可以如同引用传值一般继续利用新的变量来实现链表的链接. 后面经过查证后发现: PHP7.0版本除了对象, ...

  5. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  6. 在O(1)时间内删除单链表结点

    // 在O(1)时间内删除单链表结点 /* 思考: 很显然链表是一个节点地址不连续的存储结构 删除节点一般很容易会想到是修改p节点的前一个节点的next为p->next 然而除非是双向链表,否则 ...

  7. 13:在O(1)时间删除单链表节点

    题目:给定单项链表的头指针和一个节点指针.定义一个函数在O(1)时间删除该节点. 解析: 删除单向链表中的一个节点,常规做法是必须找到待删除节点的前一个节点才干实现.而这样做的时间复杂度是O(n).无 ...

  8. 删除单链表倒数第n个节点

    基本问题 如何删除单链表中的倒数第n个节点? 常规解法 先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点. 代码实现 /** * * Description: 删除单链表倒数第n ...

  9. 【链表问题】打卡2:删除单链表的第 K个节点

    前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题.每道题会提供简单的解答. 题目描述 在单链表中删除倒数第 K 个节点 要求 如果链表的长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 ...

随机推荐

  1. Dnsmasq(局域网DNS,DHCP)

    安装:yum -y install dnsmasq   dnsmasq配置文件: /etc/dnsmasq.conf 默认指定DNS服务器(优先级)文件:/etc/resolv.conf 默认host ...

  2. 删除字符串中多余的空白字符和空行(C语言实现)

    要求:处理一个字符串,删除字符串中多余的空格.水平制表符和空行,并满足下列要求: (1)对原字符串只能进行一次扫描.(2)不允许申请新的空间.(3)处理后的字符串的首尾不能有空格.制表符和空行.(4) ...

  3. dropdownlist控件的几个属性selectedIndex、selectedItem、selectedValue、selectedItem.Text、selectedItem.value的区别

    转自http://blog.csdn.net/iqv520/article/details/4419186 1. selectedIndex——指的是dropdownlist中选项的索引,为int,从 ...

  4. openNebula 运维系列虚拟机virtual machines operations

    1,virtual machine manage,VMInstance state; http://docs.opennebula.org/4.4/user/virtual_resource_mana ...

  5. [置顶] Android系统移植与调试之------->如何修改Android设备状态条上音量加减键在横竖屏的时候的切换与显示

    这两天由于一个客户的要求,将MID竖屏时候的状态条上的音量键去掉.所以尝试修改了一下,成功了,分享一下经验. 先看一下修改后的效果图,如下所示 . 横屏的时候:有音量加减键 竖屏的时候:音量加减键被去 ...

  6. 解析微信node开发;拿token

    获取token,本着两个原则, 1.先查询是否有token,有的话判断其时间是否与上一次请求时间差是否超过7100: a.不超过,直接用得到: b.超过,再获取刷新: 2.没有token获取刷新tok ...

  7. 1.padding和margin,几种参数

    这篇会很短. 那么如上图所示,margin指的是外边距,padding指的是内边距,border自有其像素宽度,element在1335乘以392的地方. margin和padding一样总共有四个, ...

  8. 响应式(css_media)

    开始研究响应式web设计,CSS3 Media Queries是入门. Media Queries,其作用就是允许添加表达式用以确定媒体的环境情况,以此来应用不同的样式表.换句话说,其允许我们在不改变 ...

  9. bool operator==(const Array&)const; 这最后一个const 是做什么用的

    字符重载也是个函数,在函数末尾加CONST 这样的函数叫常成员函数.常成员函数可以理解为是一个“只读”函数,它既不能更改数据成员的值,也不能调用那些能引起数据成员值变化的成员函数,只能调用const成 ...

  10. C#中的ref与out参数(本文仅作为个人笔记)

    假如一个方法的参数(形参)是引用类型,那么使用那个参数来进行的任何修改都会改变参数引用的数据.但这里的关键在于,虽然引用的数据发生了变化,但参数本生没有改变——它仍然引用的是一个对象.换句话说,虽然可 ...