删除链表的中间结点和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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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