链表是什么?

**链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。**

链表基础操作

首先我们要想,一个结点里面要有什么?
一个是数据域,第二个是指针域,指向下一个结点,所以我们用一个结构体来包括一个结点所需要的这些内容。
这是链表中的一个结点的内容

SListDataType这个类型,是用户自定义类型,可以是int ,double,char,还可以是一个结构体类型。

而这个结构体里,就是链表的创建,里面是第一个结点的指针。

初始化,首先传一个链表的结构体指针,第一步判断指针是否为空,此处用断言判断,第二步初始化,给第一结点指空。

头插,时间复杂度为O(1),传进来连边的结构体指针,和要给结点里附的值。

 一 创建新结点。二新的结点里的数据域里附传进来的值三新建结点的指针域指向第一个结点四第一个结点指向新建结点,让新建结点作为新的链表的第一个结点


尾插,有循环,O(n)

一,创建新结点,新结点数据域赋值,新结点指针域指控。
二,判断链表是否为空,如果为空,把让链表的第一个结点指针指向新建的结点。
三,找最后一个结点,隐藏着链表一定有结点,创建一个新指针指向链表第一个结点,当指针不为空时,指针往后移。循环结束后,最后一个结点的指针域指向新建结点


头删

一,首先判断,如果没有链表,没有结点不能删。
二 新建指针指向第一个结点的下一个结点.
三 释放第一个结点。
四 第一个结点指向新建指针。


尾删 O(n)

一,首先判断第一个结点 assert(s != NULL);           // 不能没有链表assert(s->first != NULL);      不能没有结点二,如果链表中只有一个结点,直接释放三,否则,创建新指针指向头结点,**当下下一个结点不为空,指针指向下一个。释放下一个结点**,最后指空


查找

一 遍历链表,找到数据域里的值相同时,返回。


删除多个值相同的结点

一判断是否为空
二 判断是否只为一个结点
三 创建新指针cur指向第一个结点,当该结点下一个不为空时,如果结点下一个的数据域里的值等于要删的值,创建新指针指向下下一个结点
四 然后释放当前结点,并让cur指向下一个结点。

不带头结点的链表基础操作(初始化,增删改查)相关推荐

  1. python单链表操作_单链表的创建、增删改查等操作(Python实现)

    单链表的创建.增删改查等操作(Python实现) # 单链表 class Node: def __init__(self, elem): self.elem = elem self.next = No ...

  2. Python列表及其基本的操作(增删改查)

    Python列表及其基本的操作(增删改查) 增 1.insert() 2.append() 3.extend() 删 1.del() 2.pop() 2.1pop() 2.2pop(索引) 3.rem ...

  3. c语言 双向链表增删修查,手写双链表,并实现增删改查

    手写双链表,并实现增删改查 public class DoublyLinkedListT { // 一个空的头节点 private final Node head = new Node(null); ...

  4. oracle将查询结果声明为伪表,Oracle查询操作(增删改查,伪表,高级查询)实例讲解...

    SQL查询操作:增删改查 一.SQL操作符 算术操作符 + - * / 比较操作符 = != < > <= >= BETWEEN--AND IN LINK IS NULL 逻辑 ...

  5. js操作indexedDB增删改查示例

    js操作indexedDB增删改查示例 if ('indexedDB' in window) {// 如果数据库不存在则创建,如果存在但是version更大,会自动升级不会复制原来的版本var req ...

  6. mysql 中caption_Django-Model操作数据库(增删改查、连表结构)(示例代码)

    Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表 基本结构 from django.db importmodelsclassuserinfo(models ...

  7. GridView的常用操作(增删改查)

    GridView的常用操作(增删改查) void BindData()         {             string sql = "select top 10 ID,jobno, ...

  8. golang连接mysql操作示例增删改查

    golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动.这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/ ...

  9. python pymysql实例_Python使用pymysql模块操作mysql增删改查实例分析

    Python使用pymysql模块操作mysql增删改查实例分析 发布时间:2020-09-30 16:42:12 来源:脚本之家 阅读:92 本文实例讲述了Python使用pymysql模块操作My ...

最新文章

  1. 超强后浪:14岁考上研究生,如今17岁的他或将成为全国最小的博士生!
  2. 锁定计算机好在下游戏吗,巧用win7锁定计算机 防止孩子沉迷游戏
  3. 关于make *.img时没有权限的问题
  4. leetcode 160 简单难度 相交链表
  5. js二维数组_Javascript数组
  6. 终于把joomla 的 protostar 模版的菜单,从垂直改到水平了
  7. Java设计模式笔记(8)装饰模式
  8. Java web后端1 XML URI与URL HTTP Tomcat
  9. php实现多条件查找分页,Yii2.0框架实现带分页的多条件搜索功能示例
  10. 贪婪算法在求解最小生成树中的应用(JAVA)--Kruskal算法
  11. 8.exchange2013实战操作之RMS
  12. 我的世界服务器皮肤文件在哪里,我的世界皮肤展开文件,皮肤站皮肤保存在哪个文件夹...
  13. 在cmd中编译C语言方法
  14. graphpad导出图片不居中_Graphpad如何导出期刊所需图
  15. 阿里视频直播自定义推拉流地址生成
  16. 【FPGA】:ip核---乘法器(multiplier)
  17. Alibaba内部首发“M8级”微服务架构手册,GitHub上杀疯了
  18. STUN, TURN, ICE介绍
  19. ssh连接工具----xmanager5
  20. 批量将JPG转换为PDF文档的方法,看完这篇你就知道了

热门文章

  1. ZOJ1081 Points Within
  2. AIX下RAC搭建 Oracle10G(六)dbca建库
  3. Response.Write具体介绍
  4. JAVA UDP网络编程学习笔记
  5. 开启和关闭wifi的代码段
  6. postgresql存图片字段类型_PostgreSQL让人着迷的多态性,另辟蹊径省时又省力
  7. python各种包安装顺序_史上最全的Python包管理工具:Anaconda教程
  8. php sql 去除重复数据,MSSQL_快速删除重复记录,SQL Server如何实现?,如果一张表的数据达到上百万 - phpStudy...
  9. python哲学翻译_Python
  10. vue 方法获取返回值_vue.js - vuex异步提交,怎么获取返回数据