删除链表的中间结点和a/b处的结点

题目:给定链表的head结点,删除一个链表的中间结点,当链表只有一个结点的时候或者head结点为空的时候返回head,当链表有两个结点的时候删除第一个节点,当链表有三个结点的时候删除第二个结点,当链表有四个结点的时候删除第二个结点,当链表有五个结点的时候删除第三个结点……

分析:一个链表长度每增加二,要删除的结点就后移一个结点,要删除一个结点需要知道它的前一个结点。

// 删除链表中间结点
Node* removeMidNode(Node* head) {
    // 如果链表的为空,且链表只有一个结点,则不需要删除
    if (head == NULL || head->next == NULL) {
        return head;
    }

    // 如果链表只有两个结点,则删除第一个结点
    if (head->next->next == NULL) {
        return head->next;
    }

    // 如果链表有两个以上的结点,则cur每走两步,pre走一步
    Node* pre = head;               // 中间结点的前一个结点从head开始
    Node* cur = head->next->next;   // cur结点从第三个结点开始
    while (cur->next && cur->next->next) {  // cur结点每走两步,中间结点走一步(即pre结点走一步)
        pre = pre->next;
        cur = cur->next->next;
    }
    
    pre->next = pre->next->next;

    return head;
}

进阶

题目:给两个整数a,b,实现删除a/b处节点的函数。r = a/b(r<=1),若r=0,不删除;其他r的值向上取整,比如r在范围(2/5,3/5]中,取3,删除第三个节点。

首先涉及到一个求链表长度,一次遍历,然后是求删第几个,涉及到一个向上取整的运算。最后依旧是注意要取得r前一个的元素,才能删除r。

#include <cmath>
// 删除a/b处的结点
Node* removeNodeRatio(Node* head, int a, int b) {
    if (head == NULL || a > b) {
        return head;
    }

    // 统计链表结点的个数
    int count = 0;
    Node* n = head;
    while (n) {
        count++;
        n = n->next;
    }

    // 计算需要删除的结点的位置
    double pos = double(a) * double(count) / double(b);
    int pos_node = ceil(pos);   // pos向上取整

    // 查找需要删除结点的前一个结点,删除需要删除的结点
    // 如果需要删除的结点为头结点,则返回head->next
    if (pos_node == 1) {
        head = head->next;
    }

    if (pos_node > 1) {
        n = head;
        while (--pos_node != 1) {   // 寻找待删除结点的前一个结点
            n = n->next;
        }

        n->next = n->next->next;
    }

    return head;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,149评论 0 25
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,646评论 0 13
  • 燕洵第一次见到元淳,是在一个午后。彼时燕洵刚刚结束与大齐的第一次战争,在好友元嵩的邀请下来到大魏稍作休整。路过御花...
    郎情妾意阅读 269评论 0 1
  • 当拿到这本书的时候我就想,这究竟是一本什么样的书,它能给我带来怎样的收获? 打开书细读的时候才真正明白“跃迁”就是...
    郭海霞_24eb阅读 102评论 0 1
  • 挣扎了很久,终于翻开这部世界名著。以前是听到过这部著作,并且还知道根据这部著作改编的电影,一直想看但又没看,如今终...
    寒梅怡人阅读 847评论 0 0