3.8.2 单链表的删除


        现在我们再来看单链表的删除。设存储元素ai的结点为q,要实现将结点q删除单链表的操作,其实就是将它的前继结点的指针绕过,指向它的后继结点即可(如图3-8-5所示)。

我们所要做的,只是实际上就是一步,p->next=p->next->next,用q来取代p->next,即是

q=p->next; p->next=q->next;

解读这两句代码,也就是说让p的后继的后继结点改成p的后继结点。有点拗口呀,那我再打个形象的比方。本来是爸爸左牵着妈妈的手,右牵着宝宝的手在马路边散步。突然迎面走来一美女,爸爸一下子看呆了,此情景被妈妈逮个正着。于是她生气地甩开牵着的爸爸的手,绕过他,扯开父子俩,拉起宝宝的左手就快步朝前走去。此时妈妈是p结点,妈妈的后继是爸爸p->next,也可以叫q结点,妈妈的后继的后继是儿子p->next->next,即q->next。当妈妈去牵儿子的手时,这个爸爸就已经与母子俩没有牵手联系了(如图3-8-6所示)。

单链表第i个数据删除结点的算法思路:
        1. 声明一结点p指向链表第一个结点,初始化j从1开始;
        2. 当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1;
        3. 若到链表末尾p为空,则说明第i个元素不存在;
        4. 否则查找成功,将欲删除的结点p->next赋值给q;
        5. 单链表的删除标准语句 p->next=q->next;
        6. 将q结点中的数据赋值给e,作为返回;
        7. 释放q结点;
        8. 返回成功。

实现代码算法如下:

/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L) *//*操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1*/Status ListDelete(LinkList *L, int i, ElemType *e) { int j;LinkList p, q;p = *L;j = 1;while (p->next && j < i) /*遍历寻找第i个元素*/{p = p->next;++j;}if (!(p->next) || j > i) return ERROR;        /*第i个元素不存在*/q = p->next;p->next = q->next;  /*将q的后继赋值给p的后继*/*e = q->data;          /*将q结点中的数据给e*/free(q);                /*让系统回收此结点,释放内存*/return OK;}

这段算法代码里,我们又用到了另一个C语言的标准函数free。它的作用就是让系统回收一个Node结点,释放内存。
        分析一下刚才我们讲解的单链表插入和删除算法,我们发现,它们其实都是由两部分组成:第一部分就是遍历查找第i个元素;第二部分就是插入和删除元素。从整个算法来说,我们很容易推导出:它们的时间复杂度都是O(n)。如果在我们不知道第i个元素的指针位置,单链表数据结构在插入和删除操作上,与线性表的顺序存储结构是没有太大优势的。但如果,我们希望从第i个位置,插入10个元素,对于顺序存储结构意味着,每一次插入都需要移动n-i个元素,每次都是O(n)。而单链表,我们只需要在第一次时,找到第i个位置的指针,此时为O(n),接下来只是简单地通过赋值移动指针而已,时间复杂度都是O(1)。显然,对于插入或删除数据越频繁的操作,单链表的效率优势就越是明显。

出处:http://www.cnblogs.com/cj723/archive/2011/03/07/1973295.html

《大话数据结构》第3章 线性表 3.8.2 单链表的删除相关推荐

  1. 高一凡-数据结构第2章-线性表

    高一凡-数据结构第2章-线性表 2.2.1线性表的顺序表示和实现 1.初始化 2.销毁与清空 3.判空与长度 4.获取元素值与位置 2.2.2换一种写法 2.2.3归并 2.3.1线性表的链式表示和实 ...

  2. 《大话数据结构》读书笔记-线性表

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 3.2 线性表的定义 3.3 线性表的抽象数据类型 3.4 ...

  3. 期末复习之数据结构 第2章 线性表

    目录 一.课本知识点 1.线性结构 2.线性表 3.线性表的顺序表示 4.顺序表的基本操作 5.线性表的链式表示 6.链表的基本操作 总结 二.练习题 一.课本知识点 1.线性结构 定义:若结构是非空 ...

  4. 线性表之顺序结构单链表

    数据结构学习笔记 文章目录 数据结构学习笔记 一.线性表的链式存储结构之单链表 1.单链表存储结构要素 2.实现过程 二.读取操作 1.算法思路 2.算法实现 三.插入操作 1.算法思路 2.算法实现 ...

  5. 【算法基础】数据结构导论第二章-线性表.pptx

    上课的课件分享,适合教学用. 文末提供下载 已发布:数据结构导论第一章-绪论 本文参考百度文库的多篇文章. 如需下载ppt文件,请回复"sjjg2" ppt有动画效果.

  6. 大话数据结构 01 :顺序线性表

    1.完整代码 #include "stdio.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0#defi ...

  7. [XJTUSE]数据结构学习——第一章 线性表 1.3 单链表的实现(JAVA)

    文章目录 1.3 单链表的实现(JAVA) 1.curr指针与头结点的说明 2.插入和删除操作的说明 插入 删除 1.3 单链表的实现(JAVA) 链表是由一系列叫做表的结点(node)的对象组成的, ...

  8. 《大话数据结构》| 第3章 线性表

    目录 3.2 线性表的定义 3.3 线性表的抽象数据类型 3.4 线性表的顺序存储结构 3.4.1 顺序存储定义 3.4.2 顺序存储方式 3.4.3 数据长度与线性表长度的区别 3.4.4 地址计算 ...

  9. C语言数据结构-第二章线性表-电大

    第二章线性表--内容简介 本章将进入线性结构的学习. 线性结构是最简单.最常用的一种数据结构. 本章将学习线性表的定义.顺序和链式两种存储方式及相应存储结构上的运算实现.通过典型示例训练,掌握线性表的 ...

最新文章

  1. Redhat 6.3 yum 本地源配置
  2. 在IDEA中为项目引入maven中央仓库中的依赖包
  3. 如何设置Reporting Services链接到网页URL的参数?
  4. 每周一起读 | ACL 2019 NAACL 2019:文本关系抽取专题沙龙
  5. IUnknown接口QueryInterface函数介绍
  6. html调用父页面的函数,js调用父框架函数与弹窗调用父页面函数的方法
  7. 转 Caffe学习系列(4):激活层(Activiation Layers)及参数
  8. SCOM2012R2 APM系列(三) 配置Java应用程序监控
  9. 《你必须知道的.NET》--简易不简单:认识枚举(Ⅲ)
  10. 【转】同步的HttpClient使用详解
  11. Swing组件集合的事件处理(六)
  12. 卷积神经网络(TextCNN)在句子分类上的实现
  13. 过程能力指数Cp与Cpk计算公式
  14. 基于python的OCR中文识别教程
  15. 433MHz,2.4GHz,GPRS,NB-IOT各有哪些特点?
  16. ArcGIS批量裁剪栅格数据
  17. ListView实现物流追踪
  18. MVC与MVP的区别
  19. 内网实现电视盒子访问PC
  20. 关于国密HTTPS的那些事(三)

热门文章

  1. JVM - 应用JVM核心参数推荐设置
  2. 实战SSM_O2O商铺_15【商铺注册】View层+Controller层之图片上传
  3. Spring Boot-Spring Tool Suit + Gradle 构建第一个Spring Boot 项目01
  4. android 看AP 国家代码,Android WiFi 获取国家码
  5. ubuntu笔记:查看Ubuntu的包依赖关系
  6. javaweb功能模块如何合理设计_产品设计:如何设计出合理的凑单模式?
  7. bgl 词典_器材屋 篇五十二:“哪里不会点哪里”的后时代——哪里不识扫哪里:科大讯飞扫描词典笔评测_点读机...
  8. 微信小程序发送验证码60秒倒计时
  9. java 大文件 md5_使用Java为大文件生成MD5非常慢
  10. A - 数据结构实验之查找一:二叉排序树