欢迎来踩

关于留言板 - 码到城攻多数文章不支持留言,此处为统一留言处https://www.codecomeon.com/posts/1/

说删链表节点,第一时间想到就是遍历整个链表,找到删除节点的前驱,改变节点指向,删除节点,但是,这样删除单链表的某一节点,时间复杂度就是O(n),不符合要求;

时间复杂度是O(n)的做法就不说了,看看O(1)的写法,看图:

删除节点,需要找到被删节点的前驱,上面的说明,交换数据后,要删的节点转换为被删节点的后一个节点,此时被删节点前驱可以知道,删除就很简单了

给出被删节点指针,O(1)时间内就可以有此方法删除节点,但是,如果,被删节点是链表最后一个节点,以上方法明显不在适用,不得不从头遍历:

这时就得从头遍历,只为找最后一个节点的前驱,就这唯一一个节点,找它的时间复杂度就是O(n),但平均时间复杂度为:

((n-1)*O(1)+O(n))/n

结果还是O(1),复合要求的,又但是,这里没有考虑要删除的节点是否在链表中,如果要判断有没有在链表中,又得遍历,结果时间复杂度有不在是O(1),

为了保证时间,被删的节点有没有在链表中,只能由人为的去控制;以下是代码段:

 //在O(1)时间内,删除一个节点,函数如下void DeleteNodeNumone(ListNode** phead,ListNode* pToBeDelete){if (*phead == nullptr || pToBeDelete == nullptr)return;//删除非尾节点if (pToBeDelete->_next != nullptr){ListNode* temp = pToBeDelete->_next;pToBeDelete->_data = temp->_data;pToBeDelete->_next = temp->_next;delete temp;temp = nullptr;}//只有一个节点else if (*phead == pToBeDelete){delete pToBeDelete;pToBeDelete = nullptr;*phead = nullptr;}//最后一种,删除节点是尾节点else{ListNode* cur = *phead;while (cur->_next != pToBeDelete){cur = cur->_next;}delete pToBeDelete;pToBeDelete = nullptr;cur->_next = nullptr;}}

完整测试代码:

#pragma once
typedef int DataType;class ListNode
{
public:ListNode(const DataType& x):_data(x), _next(NULL){}public:DataType _data;ListNode* _next;
};class Slist
{
public:Slist():_head(NULL), _tail(NULL){}~Slist(){//析构函数,删除节点,删除全部Destory();}void Destory(){ListNode* begin = _head;while (begin){ListNode* del = begin;begin = begin->_next;delete del;}}public://尾插void PushBack(const DataType& x){if (_head == NULL){_head = new ListNode(x);_tail = _head;}else{_tail->_next = new ListNode(x);_tail = _tail->_next;}}//查找ListNode* Find(const DataType& x){ListNode* tmp = _head;while (tmp){if (tmp->_data == x)return tmp;else{tmp = tmp->_next;}}return NULL;}////在O(1)时间内,删除一个节点,函数如下void DeleteNodeNumone(ListNode** phead,ListNode* pToBeDelete){if (*phead == nullptr || pToBeDelete == nullptr)return;//删除非尾节点if (pToBeDelete->_next != nullptr){ListNode* temp = pToBeDelete->_next;pToBeDelete->_data = temp->_data;pToBeDelete->_next = temp->_next;delete temp;temp = nullptr;}//只有一个节点else if (*phead == pToBeDelete){delete pToBeDelete;pToBeDelete = nullptr;*phead = nullptr;}//最后一种,删除节点是尾节点else{ListNode* cur = *phead;while (cur->_next != pToBeDelete){cur = cur->_next;}delete pToBeDelete;pToBeDelete = nullptr;cur->_next = nullptr;}}void print(){ListNode* begin = _head;while (begin){cout << begin->_data << "->";begin = begin->_next;}cout << "NULL" << endl;}public:ListNode* _head;ListNode* _tail;
};
void Test()
{Slist s1;s1.PushBack(5);s1.PushBack(2);s1.PushBack(3);s1.PushBack(2);s1.PushBack(1);s1.PushBack(6);s1.PushBack(7);s1.PushBack(9);s1.print();ListNode* num =s1.Find(9);s1.DeleteNodeNumone(&s1._head, num);s1.print();
}

测试结果:

赐教!

单向链表在O(1)时间内删除一个节点相关推荐

  1. python链表中删除一个节点数据_python实现单链表中删除倒数第K个节点的方法

    本文实例为大家分享了python实现单链表中删除倒数第K个节点的具体代码,供大家参考,具体内容如下 题目: 给定一个链表,删除其中倒数第k个节点. 代码: class LinkedListAlgori ...

  2. c语言链表如何做成环,在C语言中单向链表环测试并返回环起始节点的实现方法...

    小编想问大家一个问题,就是如果我们需要进行测试一个单向链表是否存在环,应该使用什么方法才是最好的呢?如果大家还不知道有什么方法的话,那就接着往下面看哟!因为今天小编就要为大家介绍一下:在C语言中单向链 ...

  3. 编写C函数,实现双向链表删除一个节点P。

    编写C函数,实现双向链表删除一个节点P. //删除操作 Status ListDelete_Dul(DuLinkList &L,int i,ElemType &e) {if(!(p=G ...

  4. (C++版)链表(一)——实现单向链表创建、插入、删除等相关操作

    http://blog.csdn.net/fisherwan/article/details/25557545 前段时间用C语言实现了链表的相关操作,但是发现当时挺清楚的,过了一段时间又忘的差不多了, ...

  5. 链表相关操作:创建链表、遍历链表、求链表长度、链表中删除一个节点、链表中插入一个节点、反转单链表...

    1 #include<iostream> 2 #include<stdlib.h> 3 4 typedef struct node 5 { 6 int data; 7 stru ...

  6. 单向链表的实现(不设立虚拟头节点)

    (希望我所描述的,给你带来收获!)--关于阅读笔者数据结构系列,建议先将代码粘至IDE,然后对照文字解释进行理解 开始抛出--什么是链表? 答:链表(Linked list)是一种常见的基础数据结构, ...

  7. xml实现删除一个节点

    //实现删除一个 TiXmlNode *RootElement = mDocument ->RootElement(); TiXmlNode *root=mDocument->FirstC ...

  8. 判断两个无环单向链表/有环单向链表是否相交,并返回相交节点

    题目描述:单链表可能有环,也可能无环.给定两个单链表的头节点 head1 和 head2, 这两个链表可能相交,也可能不相交.请实现一个函数,如果两个链表相交,请返回相交 的第一个节点;如果不相交,返 ...

  9. 算法—详细讲解单向链表的实现(python)

    链表 链表是一种物理存储单元上非连续.非顺序的存储结构 数据元素的逻辑顺序通过链表中的指针链接次序实现 链表由一系列节点组成,节点可以在运行时动态生成 每个节点包含两个部分:存储数据元素的数据区.存储 ...

最新文章

  1. 一行CSS样式去除百度地图版权,去除百度地图右上角平移缩放控件的市县区文字
  2. 地理坐标xy表示什么_建筑测量xy坐标的区别
  3. 弹窗时候禁止页面滚动
  4. 使用composer下载依赖包下载失败的解决方法
  5. 互联网晚报 | 2月25日 星期五 | 元宇宙概念,热度显著下降;​腾讯正洽谈落地“东数西算”大湾区枢纽韶关数据中心集群...
  6. Linux 5.10将解决2038年问题
  7. XML解析模型(完整版)
  8. module.exports,exports,export和export default,import与require区别与联系
  9. QT记录博客总结(内有对应电子书与源代码)
  10. Facebook广告投放有哪些比较好的策略?
  11. PyQt5-在窗口上绘制文本 QPainter
  12. google map 地理编码API的两种方式
  13. OSX: 命令行制作U盘Recovery HD
  14. Dagger2的基本使用
  15. WebSpider蓝蜘蛛网页抓取工具5.1用户手册
  16. 26岁亿万富翁创业日记曝光(二)
  17. 处理机调度——看这一篇就够了
  18. 【DFT leakage 频谱泄露现象】
  19. 本地系统服务例程:Nt和Zw系列函数
  20. django框架--中间件系统

热门文章

  1. socat使用指南:2:工作原理与选项说明
  2. 读书日| 蚂蚁金服CTO程立:碎片化阅读永远无法建立对一个深度问题真正的、系统的理解...
  3. 大咖实录|阿里巴巴集团技术委员会主席王坚2017云栖大会演讲
  4. Hadoop分布式高可用HA集群搭建笔记(含Hive之构建),java高级架构师视频
  5. 一、了解Scrapy
  6. 《超级符号原理》—超级符号
  7. Linux三行命令快速安装jdk和jre(javac)
  8. 【IDE】【IDEA】批量将GBK编码的工程,转换为UTF8编码的工程
  9. dede image.class.php,摘自织梦CMS中的图片处理类
  10. Java 8 Update 251 (8u251)